Ver Mensaje Individual
  #1  
Antiguo 27-06-2016
ElDuc ElDuc is offline
Miembro
 
Registrado: jul 2004
Posts: 197
Reputación: 20
ElDuc Va por buen camino
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.
Responder Con Cita