PDA

Ver la Versión Completa : Obtener proceso de una ventana.


Thor
02-05-2006, 17:06:37
Estaba enumerando las ventanas del sistema operativo, lo que queria era saber a que proceso corresponde una ventana, os pongo codigo:

procedure TForm1.Button1Click(Sender: TObject);
begin
EnumWindows(@EnumProcess, 0);
end;

function EnumProcess(hHwnd: HWND; lParam : integer): boolean; stdcall;
var
pPid : DWORD;
title : array [0..255] of char;
Ruta : array [0..MAX_PATH] of char;
begin
if (hHwnd=NULL) then
begin
result := false;
end
else
begin
GetWindowThreadProcessId(hHwnd,pPid);
GetWindowText(hHwnd, title, 255);
//Esto no funciona bien
GetWindowModuleFileName(hHwnd, Ruta, MAX_PATH);
ShowMessage(title+' - '+Ruta+' - '+IntToStr(pPid));
Result := true;
end;
end;

Yo pensaba que usando GetWindowModuleFileName y pasandole el handle de la ventana me daria el proceso pero no funciona asi.

¿Que hago mal? ¿Que handle hay que pasarle a GetWindowModuleFileName?

Saludos.

delphi.com.ar
02-05-2006, 17:57:34
Supongo que ese código lo obtuviste de aquí (http://delphi.about.com/od/windowsshellapi/l/aa080304a.htm), y si te fijas lo que esta haciendo, es enumerando todas las ventanas indicando a que proceso pertenece cada una.
A la pregunta de cómo obtener proceso de una ventana, la respuesta es utilizando GetWindowThreadProcessId. Si quieres saber el nombre del ejecutable de un proceso, sin buscar si existe alguna función que lo resuelva, se me ocurre algo tan sencillo como:

function GetExeNameByProcessId(dwProcessId: DWORD): string;
var
snp: THandle;
lppe: TProcessEntry32;
begin
Result := '';
snp := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
try
lppe.dwSize:=SizeOf(lppe);
if Process32First(snp, lppe) then
repeat
if lppe.th32ProcessID = dwProcessId then
begin
Result := StrPas(lppe.szExeFile);
Break;
end;
until not(Process32Next(snp, lppe));
finally
CloseHandle(snp);
end;
end;

Tendrías que reemplazar GetWindowModuleFileName por esta función.

Saludos!

Thor
02-05-2006, 18:46:55
Asi es, lo saque de alli.

Probare lo que dices.

Que pena, con lo facil que seria si GetWindowModuleFileName funcionara con el handle de la ventana :(.

Muchas gracias.