HWND hw = FindWindow(NULL, L"Window Title");
if (hw)
{
DWORD dwProcessId = 0;
DWORD dwThreadId = GetWindowThreadProcessId(hw, &dwProcessId);
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessId);
if (hProcess)
{
wchar_t *szExeName[1024] = {0};
if (QueryFullProcessImageName(hProcess, 0, szExeName, _countof(szExeName))
{
// ...
}
CloseHandle(hProcess);
}
}
Вы, вероятно, должны также использовать аргумент класса (тот, который равен NULL в моей первой строке), если вы знаете его, так что с меньшей вероятностью вы случайно найдете окно какой-то другой программы, которое, как оказалось, имееттот же заголовок.
Конечно, имя класса также не обязательно должно быть уникальным между программами, но комбинация более надежна, чем просто использование заголовка.
Вы можете получить окнокласс легко с помощью Spy ++.
Редактировать: QueryFullProcessImageName требует Vista, но вы можете поменять эту строку на ту, которая использует GetProcessImageFileName согласно ответу DReJ.
Edit2: если вы не компилируете для Unicode,удалите «L» перед «Заголовком окна» и используйте буфер символов вместо wchar_t.