Как получить исполняемое имя окна
Я пытаюсь получить имя исполняемого файла имя всех моих запущенных окон, и моя проблема в том, что:
Я использую метод
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 вы должны сделать следующее.
- получить процесс окна с
GetWindowThreadProcessId
. - откройте процесс с правами доступа PROCESS_QUERY_INFORMATION и PROCESS_VM_READ, используя
OpenProcess
. - использовать
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.