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

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

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

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

Примечание: тест.exe-это имя моего исполняемого файла, но это не полный путь Notepad++... и это делает это для Mozilla Thunderbird тоже... Не понимаю почему!--4-->

Я использую функцию следующим образом:

char filenameBuffer[4000];
if (GetWindowModuleFileName(hWnd, filenameBuffer, 4000) > 0)
{
    std::cout << "GetWindowModuleFileName(): " << filenameBuffer << std::endl;
}

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

5 ответов


функция работает только для windows в текущем процессе.1 вы должны сделать следующее.

  1. получить процесс окна с GetWindowThreadProcessId.
  2. откройте процесс с правами доступа PROCESS_QUERY_INFORMATION и PROCESS_VM_READ, используя OpenProcess.
  3. использовать GetModuleFileNameEx на процесс обработки.

если вы действительно хотите получить имя модуля с какое окно зарегистрировано (в отличие от исполняемого файла процесса), вы можете получить дескриптор модуля с помощью GetWindowLongPtr С GWLP_HINSTANCE. Затем дескриптор модуля может быть передан вышеупомянутому GetModuleFileNameEx.


Аааа. Я прочитал страницу MSDN внизу.

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

GetWindowModuleFileName и GetModuleFileName правильно получить информация АБ... GetWindowModuleFileName и GetModuleFileName правильно получить сведения о windows и модулях в процессе вызова. В Windows 95 и 98, они возвращают информацию о windows и модули в другом процессы. Однако, в Windows NT 4.0 с и Windows 2000, так как модуль ручки больше не являются общими для всех процессов как они были в Windows 95 и 98, эти API не возвращают информацию о windows и модулях в другом процессы.

для получения дополнительной информации о Windows 2000, используйте помощник состояния процесса набор API (известный как PSAPI, см. Psapi.h включить файл), доступный с Windows NT 4.0. API, такие как GetModuleFileNameEx и Эквивалент предложения GetModuleBaseName функциональность.

попробуйте использовать GetModuleFileNameEx.


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

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

что вы ожидаете получить обратно?


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

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

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


Это пример того, как получить имя исполняемого файла, который создает окно, надеюсь, это может дать вам некоторые идеи о:

    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.