Я пытаюсь получить название исполняемого названия всех моих запущенных окон, и моя проблема состоит в том что:
Я использую метод
UINT GetWindowModuleFileName(
HWND hwnd,
LPTSTR lpszFileName,
UINT cchFileNameMax);
И я не понимаю, почему это не работает.
Данные, которые я имею об окне:
- HWND И 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 является названием моего исполняемого файла, но это не полный путь Блокнота ++..., и это делает это для Mozilla Thunderbird также... Я не понимаю почему
Я использую функцию как это:
char filenameBuffer[4000];
if (GetWindowModuleFileName(hWnd, filenameBuffer, 4000) > 0)
{
std::cout << "GetWindowModuleFileName(): " << filenameBuffer << std::endl;
}
Спасибо за Ваш ответ.
Функция GetWindowModuleFileName (...)
работает только для окон в текущем процессе. 1
Вы должны сделать следующее:
GetWindowThreadProcessId
. OpenProcess
. GetModuleFileNameEx
для дескриптора процесса. Если вы действительно хотите получить имя модуля, с которым зарегистрировано окно (в отличие от исполняемого файла процесса), вы можете получить дескриптор модуля с помощью GetWindowLongPtr
с помощью GWLP_HINSTANCE. Затем описатель модуля может быть передан в вышеупомянутый GetModuleFileNameEx
.
TCHAR buffer[MAX_PATH] = {0};
DWORD dwProcId = 0;
GetWindowThreadProcessId(hWnd, &dwProcId);
HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ , FALSE, dwProcId);
GetModuleFileName((HMODULE)hProc, buffer, MAX_PATH);
CloseHandle(hProc);
Согласно странице MSDN для GetWindowModuleFileName
, похоже, вы вызываете его правильно, и если ваш исполняемый файл находится в корне C: он возвращает правильное значение :
Функция GetWindowModuleFileName извлекает полный путь и имя файла модуля, связанного с указанным дескриптором окна.
Что вы ожидаете получить в ответ?
http://support.microsoft.com /? id = 228469
Резюме: GetWindowModuleFileName не работает для окон в других процессах в Windows на базе NT.
Вместо этого вы можете использовать QueryFullProcessImageName , если у вас есть дескриптор процесса. Вы можете получить дескриптор процесса с помощью OpenProcess , который вы можете использовать, если у вас есть идентификатор процесса. Вы можете получить идентификатор процесса из HWND, используя GetWindowThreadProcessId
Аааа. Я прочитал страницу MSDN внизу.
Из http://support.microsoft.com/?id=228469
GetWindowModuleFileName и GetModuleFileName правильно извлекают информацию о ... GetWindowModuleFileName и GetModuleFileName правильно извлекает информацию об окнах и модулях в вызывающем процессе. В Windows 95 и 98 они возвращают информацию об окнах и модулях в других процессах. Однако в Windows NT 4.0 и Windows 2000, поскольку дескрипторы модулей больше не используются всеми процессами , как это было в Windows 95 и 98, эти API не возвращают информацию об окнах и модулях в других процессах.
Чтобы получить дополнительную информацию о Windows 2000, используйте набор API-интерфейсов Process Status Helper (известный как PSAPI, см. включаемый файл Psapi.h), доступный с { {1}} Windows NT 4.0. Такие API, как GetModuleFileNameEx и GetModuleBaseName, предлагают эквивалентные функции .
Попробуйте использовать вместо него GetModuleFileNameEx .