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
您必须执行以下操作:
GetWindowThreadProcessId
.OpenProcess
.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。