Как получить Исполняемое название окна

Я пытаюсь получить название исполняемого названия всех моих запущенных окон, и моя проблема состоит в том что:

Я использую метод

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;
}

Спасибо за Ваш ответ.

15
задан Jaguar 7 March 2010 в 19:32
поделиться

4 ответа

Функция GetWindowModuleFileName (...) работает только для окон в текущем процессе. 1

Вы должны сделать следующее:

  1. Получить процесс окна с помощью GetWindowThreadProcessId .
  2. Откройте процесс с правами доступа PROCESS_QUERY_INFORMATION и PROCESS_VM_READ, используя OpenProcess .
  3. Используйте 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);
21
ответ дан 1 December 2019 в 02:29
поделиться

Согласно странице MSDN для GetWindowModuleFileName , похоже, вы вызываете его правильно, и если ваш исполняемый файл находится в корне C: он возвращает правильное значение :

Функция GetWindowModuleFileName извлекает полный путь и имя файла модуля, связанного с указанным дескриптором окна.

Что вы ожидаете получить в ответ?

1
ответ дан 1 December 2019 в 02:29
поделиться

http://support.microsoft.com /? id = 228469

Резюме: GetWindowModuleFileName не работает для окон в других процессах в Windows на базе NT.

Вместо этого вы можете использовать QueryFullProcessImageName , если у вас есть дескриптор процесса. Вы можете получить дескриптор процесса с помощью OpenProcess , который вы можете использовать, если у вас есть идентификатор процесса. Вы можете получить идентификатор процесса из HWND, используя GetWindowThreadProcessId

2
ответ дан 1 December 2019 в 02:29
поделиться

Аааа. Я прочитал страницу 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 .

3
ответ дан 1 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: