Представьте, что у меня есть Firefox, и я открываю стартовую страницу Firefox, затем у меня должно появиться окно с заголовком: «Стартовая страница Mozilla Firefox — Mozilla Firefox».
Я могу найти дескриптор окна с кодом ниже
HWND hwnd = ::FindWindow(0, _T("Mozilla Firefox Start Page - Mozilla Firefox"));
Но то, что я хочу, это найти дескриптор окна по имени исполняемого файла окна, как это
HWND hwnd = FindWindowFromExe(_T("firefox.exe"));//How to make this function?
Есть ли в Windows Api такая функция, как FindWindowFromExe ()? Если это не так, каков наилучший способ найти окно из его exe?
Спасибо за прочтение 🙂
Не существует единой API-функции для поиска окна по имени файла собственного процесса. Вам придется искать его вручную.
Ты можешь использовать EnumWindows()
перечислить все окна верхнего уровня или использовать FindWindow()
/FindWindowEx()
найти / перечислить конкретные типы окон.
Для каждого окна вы можете:
GetWindowThreadProcessId()
чтобы получить идентификатор процесса, которому принадлежит окно, затемOpenProcess()
открыть HANDLE
к этому процессу, тоGetModuleFileNameEx()
, GetProcessImageFileName()
, или же QueryFullProcessImageName()
запросить процесс для его полного пути и имени файла.или же
GetWindowModuleFileName()
запросить у окна полный путь и имя файла модуля, который его создал (при условии, что предполагаемое окно создано фактическим EXE, а не DLL, используемой EXE).Когда у вас есть имя окна, вы можете сравнить его с вашим целевым именем.
Других решений пока нет …