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)
-   -   Hallar la ventana de un proceso en ejecución (https://www.clubdelphi.com/foros/showthread.php?t=90501)

ElDuc 27-06-2016 12:43:40

Hallar la ventana de un proceso en ejecución
 
Hola a todos.

Estoy interesado en trabajar con una ventana de un proceso en ejecución, del cual conozco el nombre del ejecutable "Programa.exe", su ubicación "C:\AAA\BBB\Programa.exe" y la ID del proceso, obtenida con:

Código Delphi [-]
Function ProcessId(ExeName:String):Cardinal;
Var
    APro: TProcessEntry32;
    Handle: THandle;
    Ok: Boolean;
    Count: Integer;
Begin
Result:=0;
Handle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
APro.dwSize := SizeOf(APro);
Ok := Process32First(Handle, APro);
While Ok Do
    Begin
    If ExtractFileName(APro.szExeFile)=ExeName Then
        Begin
        Result:=APro.th32ProcessID;
        Break;
        End;
CloseHandle(Handle);
End;

Ahora ya tengo el Id del proceso, pero no sé como localizar la ventana principal de dicho proceso. Tened en cuenta que esta ventana puede no estar visible o minimizada y precisamente lo que yo necesito es hacerla visible, ponerla en Left=0 / Top=0 y dimensionar su Width y Height.

Trabajo con Delphi 10, Windows Vista y el proceso es de un tercero. Lo que yo pretendo es interactuar con él:

Código Delphi [-]
Function MouseClick(X: DWORD; Y: DWORD): DWORD;
Var
    P: TPoint;
    VInput: TINPUT; // array [0..1] of TINPUT;
Begin
GetCursorPos(P); // Guardo las coordenadas del mouse
SetCursorPos(X, Y); // Posiciono el mouse
// Mando la pulsación del mouse (Down)
ZeroMemory(@VInput, SizeOf(VInput));
VInput.Tipo := INPUT_MOUSE;
VInput.mi.dx := X;
VInput.mi.dy := Y;
VInput.mi.dwFlags := MOUSEEVENTF_LEFTDOWN;
Result := Windows.SendInput(1, tagINPUT(VInput), SizeOf(TINPUT));
// Mando la pulsación del mouse (UP)
VInput.Tipo := INPUT_MOUSE;
VInput.mi.dx := X;
VInput.mi.dy := Y;
VInput.mi.dwFlags := MOUSEEVENTF_LEFTUP;
Result := Windows.SendInput(1, tagINPUT(VInput), SizeOf(TINPUT));
SetCursorPos(P.X, P.Y); // Restauro las coordenadas del Mouse
End;

Esto me funciona perfectamente, pero para ello debo poner la pantalla del proceso en una posición y tamaño conocidas y visible.

Si podéis ayudarme me daréis un empujón de agradecer.

Neftali [Germán.Estévez] 27-06-2016 15:09:24

Yo probaría a explorar la ventanas y a partir de ahí intentar averiguar cuales pertenecen al proceso que tú quieres.
Lo que no se es cómo vas a acceder a la "ventana principal" sin tener más información.

Para el tema de las ventanas te recomiendo este hilo o también puedes realizar una búsqueda por la función EnumWindowsProc.

ElDuc 27-06-2016 18:40:10

Gracias Neftali,

Estoy probando con EnumWindows, cuando tenga algo que funcione lo pongo.


La franja horaria es GMT +2. Ahora son las 06:29:24.

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