Ну вообще можно немножко поговнокодить..
Создадим удобную структурку:
struct HandleData
{
DWORD process_id;
HWND window_handle;
};
Теперь вспомним о такой функции как EnumWindows
У нее в первом аргументе тайпдеф на каллбек поиска окна.
Сделаем же его:
BOOL CALLBACK EnumWindowsCallback(HWND handle, LPARAM lParam)
{
HandleData& data = *(HandleData*)lParam;
DWORD pid = 0;
GetWindowThreadProcessId(handle, &pid );
if (data.process_id != process_id)
return TRUE;
data.window_handle = handle;
return FALSE;
}
и теперь получим окно по пиду процесса:
HWND GetWindow(DWORD process_id)
{
HandleData data;
data.process_id = process_id;
data.window_handle = 0;
EnumWindows(EnumWindowsCallback, (LPARAM)&data);
return data.window_handle;
}
Используем:
HWND hWnd = GetWindow(FindPID("csgo.exe"));
DWORD FindPID(LPCSTR Name)
{
while (true)
{
//create process snapshot
HANDLE procSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
PROCESSENTRY32 procInfo = { 0 };
procInfo.dwSize = sizeof(PROCESSENTRY32);
//parse process list
while (Process32Next(procSnap, &procInfo))
{
if (!strcmp(Name, procInfo.szExeFile))
{
//process found
CloseHandle(procSnap);
return procInfo.th32ProcessID;
}
}
Sleep(80);
}
}
ну и остается только проверить
Как то так, я старался ¯\_(ツ)_/¯