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

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

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

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 Вам нужно сделать следующее.

  • Получить процесс окна с помощью GetWindowThreadProcessId.
  • Откройте процесс с правами доступа PROCESS_QUERY_INFORMATION и PROCESS_VM_READ, используя OpenProcess.
  • Используйте GetModuleFileNameEx в дескрипторе процесса.

Если вы действительно хотите получить имя модуля, с которым зарегистрировано окно (в отличие от исполняемого файла процесса), вы можете получить дескриптор модуля с 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