我尝试获取所有已启动窗口的可执行文件名称,我的问题是:
我用方法
UINT GetWindowModuleFileName(
HWND hwnd,
LPTSTR lpszFileName,
UINT cchFileNameMax);
而且我不明白为什么它不起作用。
我拥有的关于窗口的数据是:
-HWND 和进程 ID
错误是:例如:
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;
}
谢谢您的答复。
原文由 Jaguar 发布,翻译遵循 CC BY-SA 4.0 许可协议
GetWindowModuleFileName
函数仅适用于当前进程中的窗口。您必须执行以下操作:
GetWindowThreadProcessId
检索窗口的进程。PROCESS_QUERY_INFORMATION
和PROCESS_VM_READ
访问权限打开进程OpenProcess
。GetModuleFileNameEx
。如果您确实想获得注册窗口的模块的名称(而不是进程可执行文件),您可以使用
GetWindowLongPtr
和GWLP_HINSTANCE
获得模块句柄。然后可以将模块句柄传递给前面提到的GetModuleFileNameEx
。例子: