Hola c0lo, hacía tiempo que no pasabas por aquí.
En primer lugar, he de decirte que por el nombre del proceso puedes encontrar mas de uno, es decir, pueden correr mas de una instancia de un proceso o procesos con nombres similares. Deberás saber cual es el que te interesa. Mejor sería conociendo el Pid del proceso que te interesa, pues es un identificador único.
Para conseguir lo que quieres sabiendo sólo el nombre de un proceso, primero debes buscar el Pid del proceso. En el ejemplo nos conformamos con el primero que encontremos. Después enumeramos todas las ventanas hasta encontrar una que pertenezca al proceso en cuestión y de esta calculamos su parent último:
struct WINDATA{
HWND hWin;
DWORD ProcessId;
};
BOOL CALLBACK EnumWindowsProc(HANDLE Handle, WINDATA* Data)
{
DWORD ProcessId;
GetWindowThreadProcessId(Handle, &ProcessId);
if(Data->ProcessId == ProcessId){
Data->hWin = Handle;
return false;
}
return true;
}
HWND GetWindow(char* FileName)
{
// Encontrar una ventana del proceso
WINDATA Data = {0};
PROCESSENTRY32 proc = { sizeof(proc) };
HANDLE hSysSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hSysSnapshot != INVALID_HANDLE_VALUE && Process32First(hSysSnapshot, &proc)){
do{
if(!stricmp(proc.szExeFile, FileName)){
Data.ProcessId = proc.th32ProcessID;
EnumWindows((PROC)EnumWindowsProc, LPARAM(&Data));
break;
}
}while(Process32Next(hSysSnapshot, &proc));
}
CloseHandle(hSysSnapshot);
// Encontar MainWindow
HWND hParent = Data.hWin;
do {
Data.hWin = hParent;
hParent = GetParent(Data.hWin);
}while(hParent);
return Data.hWin;
}
Ejemplo de uso:
HWND hW = GetWindow("Notepad.exe");
Espero que te aclare las ideas.
Saludos.