Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   no encuentra mi aplicacion FindWindow (https://www.clubdelphi.com/foros/showthread.php?t=50809)

federicorl 28-11-2007 19:51:47

no encuentra mi aplicacion FindWindow
 
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:

Código Delphi [-]
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

Checa la ayuda Windows SDK
 
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.

Código Delphi [-]
 
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í o aquí.


La franja horaria es GMT +2. Ahora son las 16:55:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi