PDA

Ver la Versión Completa : no encuentra mi aplicacion FindWindow


federicorl
28-11-2007, 19:51:47
se que algo debo estar haciendo mal estoy probando un teclado virtual y empece con el notepad

Var
manejador : THandle;
h: HWND;
Begin
h := FindWindow('Notepad', nil);
if h = 0 then ShowMessage('No se encontro la Aplicacion')
else
begin
SetForegroundWindow(h);

y me funciono bien pero cuando en Findwindow cambie 'Notepad' por el nombre de mi aplicacion no funciona, inmediatamente me indica que no encontro la aplicacion, alguien sabra que estoy haciendo mal?

de antemano les agradezco su tiempo, saludos!

Chris
06-12-2007, 15:38:27
Intentas hacer una aplicación que solo pueda ejecutarse en una sola instancia? Si es así, esa no es la forma recomendada de hacerlo. Los componentes Jedi incluyen un componente para hacer evitar que tu aplicación se ejecute más de una vez al mismo tiempo. El componente se llama JvgSingleInstance y sólo necesitas colocarlo en algún formulario de tu aplicación.

Saludos.

paldave
08-12-2007, 13:35:15
Prueba con esta función:

function TOneInstance.IsRunning: Boolean;
const
SSubClass = '.OneInstance.';
var
Mutex: THandle;
Flag: DWORD;
begin
Result := False;
if csDesigning in ComponentState then Exit;

Result := True;
Mutex := CreateMutex(nil, True,
PChar(Application.Title + SSubClass + 'CriticalSection'));
if (GetLastError <> 0) or (Mutex = 0) then Exit;

_OneInstanceMutex := CreateMutex(nil, False,
PChar(Application.Title + SSubClass + 'Default'));
Flag := WaitForSingleObject(_OneInstanceMutex, 0);
Result := (Flag = WAIT_TIMEOUT);

ReleaseMutex(Mutex);
CloseHandle(Mutex);
end;

Llámala en el evento OnCreate del MainForm de tu aplicación, detectará si ya hay ejecutándose otra aplicación con el mismo título y te devolverá ese valor.
Suerte.

Faust
08-12-2007, 14:14:19
Ey amigo, checa la ayuda de Windows SDK (menú Help-> Windows SDK) y busca FindWindow.

Aqui nos dice:

The FindWindow function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.


HWND FindWindow(
LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);



El primer parámetro de FindWindow es el nombre de la clase de la ventana que buscas y el segundo parámetro es el nombre o el caption de la ventana que buscas.

Neftali [Germán.Estévez]
10-12-2007, 10:46:37
Hay dos formas de llamar a la función findWindows, como ya te han dicho.
* Utilizando Título de la ventana
* Utilizando el nombre de la clase.

Para el notepad has utilizado el nombre de la clase y te ha funcionado, ya que la ventana del Notepad tiene como nombre de clase "notepad".

Si quieres utilizarlo con tu aplicación debes saber cual es el nombre de la clase del form que estás llamando; Para saberlo puedes utilizar varias utilizades (yo uso WinExplorer, aunque seguro que hay más).

Si no puedes encontrar el nombre de la clase, siempre te queda utilizar el otro parámetro y llamar a la función FindWindows utilizando el título de la ventana, aunque esa forma creo que es menos segura.

Neftali [Germán.Estévez]
10-12-2007, 10:49:06
Ya hemos hablado antes en los foros de esta utilidad y de algunas otras: aquí (http://www.clubdelphi.com/foros/showpost.php?p=117967&postcount=2) o aquí (http://www.clubdelphi.com/foros/showthread.php?t=39800&highlight=winexplorer).