Как получить исполняемое имя окна
Я пытаюсь получить имя исполняемого имени всех моих запущенных окон, и моя проблема в том, что:
Я использую метод
UINT GetWindowModuleFileName(
HWND hwnd,
LPTSTR lpszFileName,
UINT cchFileNameMax);
И я не понимаю, почему это не работает.
Данные, которые у меня есть о окне:
-HWND AND PROCESSID
Ошибка:
например:
HWND: 00170628
ProcessId: 2336
WindowTitle: C:\test.cpp - Notepad++
GetWindowModuleFileName(): C:\test.exe
HWND: 00172138
ProcessId: 2543
WindowTitle: Firefox
GetWindowModuleFileName(): C:\test.exe
HWND: 00120358
ProcessId: 2436
WindowTitle: Mozilla Thunderbird
GetWindowModuleFileName(): C:\test.exe
Примечание. test.exe - это имя моего исполняемого файла, но это не полный путь Notepad ++... и он делает это для Mozilla Thunderbird тоже... Я не понимаю, почему
Я использую функцию следующим образом:
char filenameBuffer[4000];
if (GetWindowModuleFileName(hWnd, filenameBuffer, 4000) > 0)
{
std::cout << "GetWindowModuleFileName(): " << filenameBuffer << std::endl;
}
Спасибо за ваш ответ.
Ответы
Ответ 1
Функция работает только для окон только в текущем процессе. 1 Вам нужно сделать следующее.
Если вы действительно хотите получить имя модуля, с которым зарегистрировано окно (в отличие от исполняемого файла процесса), вы можете получить дескриптор модуля с GetWindowLongPtr
с GWLP_HINSTANCE. Затем дескриптор модуля может быть передан в вышеупомянутый GetModuleFileNameEx
.
Ответ 2
Аа. Я прочитал страницу MSDN внизу.
От http://support.microsoft.com/?id=228469
GetWindowModuleFileName и GetModuleFileName правильно восстановить информация ab... GetWindowModuleFileName и GetModuleFileName правильно восстановить информация о окнах и модулях в вызывающем процессе. В Windows 95 и 98, они возвращают информацию о окон и модулей в других процессы. Однако в Windows NT 4.0 и Windows 2000, поскольку модуль обрабатывает больше не используются всеми процессами как и в Windows 95 и 98, эти API не возвращают информацию о окнах и модулях в других процессы.
Подробнее о Windows 2000, используйте помощника статуса процесса набор API (известный как PSAPI, см. Psapi.h включает файл), доступный с Windows NT 4.0. API, такие как GetModuleFileNameEx и GetModuleBaseName предлагает эквивалент функциональность.
Попробуйте вместо GetModuleFileNameEx.
Ответ 3
В соответствии с страница MSDN для GetWindowModuleFileName
вы, кажется, вызываете его правильно, и если ваш исполняемый файл находится в root из C: он возвращает правильное значение:
Функция GetWindowModuleFileName получает полный путь и имя файла модуля, связанного с указанным дескриптором окна.
Чего вы ожидаете вернуться?
Ответ 4
Это пример того, как получить имя исполняемого файла, создающего окно, и надеяться, что оно может дать вам некоторые идеи о:
while(true)
{
Sleep(250);//reduce cpu usage
CHAR __name[MAX_PATH];//name buffer
HWND hwnd;//window handle
DWORD pid;//process pid
hwnd=FindWindow(NULL,NULL);//find any window
PROCESSENTRY32 entry;//process structure containing info about processes
entry.dwSize=sizeof(PROCESSENTRY32);
HANDLE snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//get processes
if(hwnd!=0)
{
GetWindowThreadProcessId(hwnd,&pid);//get found window pid
}
if (Process32First(snapshot,&entry)==TRUE)//start listing processes
{
while (Process32Next(snapshot,&entry)==TRUE)
{
if (stricmp(entry.szExeFile,"explorer.exe")==0)
{
if(pid!=entry.th32ProcessID)//if found window pid is explorers one, skip it
{
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);//open processusing PROCESS_ALL_ACCESS to get handle
if(hProcess!=NULL)
{
GetModuleFileNameEx(hProcess,NULL,__name,MAX_PATH);//get executable path
cout<<"Found: "<<__name<<endl;
}
}
}
}
}
Чтобы использовать GetModuleFileNameEx(), вам, вероятно, потребуется установить настройки компоновщика для связывания библиотеки psapi. Также включите psapi.h.
Ответ 5
http://support.microsoft.com/?id=228469
Исполнительное резюме: GetWindowModuleFileName не работает для Windows в других процессах в Windows на базе Windows.
Вместо этого вы можете использовать QueryFullProcessImageName после того, как у вас есть дескриптор процесса. Вы можете обработать процесс с помощью OpenProcess, который вы можете использовать, когда у вас есть идентификатор процесса. Вы можете получить идентификатор процесса из HWND, используя GetWindowThreadProcessId