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

新手上路,请多包涵

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

我用方法

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 许可协议

阅读 897
2 个回答

GetWindowModuleFileName 函数仅适用于当前进程中的窗口。

您必须执行以下操作:

  1. 使用 GetWindowThreadProcessId 检索窗口的进程。
  2. 使用 PROCESS_QUERY_INFORMATIONPROCESS_VM_READ 访问权限打开进程 OpenProcess
  3. 在进程句柄上使用 GetModuleFileNameEx

如果您确实想获得注册窗口的模块的名称(而不是进程可执行文件),您可以使用 GetWindowLongPtrGWLP_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);

原文由 avakar 发布,翻译遵循 CC BY-SA 4.0 许可协议

啊。我阅读了底部的 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

原文由 user257111 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题