如何获取窗口的可执行文件名称

Jag*_*uar 15 c++ windows winapi

我尝试获取所有已启动的窗口的可执行文件名称,我的问题是:

我用的方法

UINT GetWindowModuleFileName(      
HWND hwnd,
LPTSTR lpszFileName,
UINT cchFileNameMax);
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它不起作用.

我对窗口的数据是:
-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
Run Code Online (Sandbox Code Playgroud)

注意:test.exe是我的可执行文件的名称,但它不是Notepad ++的完整路径......而且它也是Mozilla Thunderbird的...我不明白为什么

我使用这样的函数:

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

感谢您的答复.

ava*_*kar 21

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);
Run Code Online (Sandbox Code Playgroud)


小智 5

啊啊。我阅读了底部的 MSDN 页面。

来自http://support.microsoft.com/?id=228469(archive.org链接

GetWindowModuleFileName 和 GetModuleFileName 正确检索有关调用进程中的窗口和模块的信息。在Windows 95和98中,它们返回有关其他进程中的窗口和模块的信息。但是,在 Windows NT 4.0 和 Windows 2000 中,由于模块句柄不再像 Windows 95 和 98 上那样由所有进程共享,因此这些 API 不会返回有关其他进程中的窗口和模块的信息。

要获取有关 Windows 2000 的更多信息,请使用从 Windows NT 4.0 起可用的 Process Status Helper API 集(称为 PSAPI,请参阅 Psapi.h 包含文件)。GetModuleFileNameEx 和 GetModuleBaseName 等 API 提供等效功能。

尝试改用GetModuleFileNameEx