gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:34:42 43 4
gpt4 key购买 nike

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

我用方法

UINT GetWindowModuleFileName(      
HWND hwnd,
LPTSTR lpszFileName,
UINT cchFileNameMax);

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

关于窗口的数据是:
-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

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

我使用这样的功能:

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

感谢您的回复。

最佳答案

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

您必须执行以下操作:

  1. 使用 GetWindowThreadProcessId 检索窗口的进程.
  2. 使用 OpenProcess 打开具有 PROCESS_QUERY_INFORMATIONPROCESS_VM_READ 访问权限的进程.
  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);

关于c++ - 如何获取窗口的可执行文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2397578/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com