【发布时间】:2017-04-16 14:40:28
【问题描述】:
我正在尝试获取具有可见窗口的进程的名称。例如,如果我打开了 Chrome,我想获取字符串“chrome.exe”,但我只能使用下面的代码获取初始值“unknown”。
我读到它可能是访问权限问题,您能建议我如何更改它们以获得进程名称吗?
DWORD idProc = 0; //pointer to the process which created the window
DWORD idThread = GetWindowThreadProcessId(Wnd->get_handle(), &idProc);
Wnd->set_pid(idThread); //Wnd is an object of a class i created, to collect processes info
// Get a handle to the process.
TCHAR szProcessName[DEFAULT_BUFLEN] = TEXT("<unknown>");
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, idProc);
if (hProcess!=NULL) {
HMODULE hMod;
DWORD cbNeeded;
if (EnumProcessModules(hProcess, &hMod, sizeof(hMod),
&cbNeeded))
{
GetModuleBaseName(hProcess, hMod, szProcessName,
sizeof(szProcessName) / sizeof(TCHAR));
}
}
Wnd->set_processname(szProcessName);
CloseHandle(hProcess);
正如我所说,它适用于某些进程,但不适用于 Chrome 等其他许多进程。
编辑:我忘了说,我刚刚过滤了可见窗口,所以假设句柄是我需要的。
【问题讨论】:
-
您需要添加错误检查,以便您知道哪些调用失败了。
-
好的,首先感谢您的回答。我添加了一些 std::cout
-
documentation 说:“如果这个函数是从运行在 WOW64 上的 32 位应用程序调用的,它只能枚举 32 位进程的模块。如果该进程是一个 64 位进程,此函数失败,最后一个错误代码是 ERROR_PARTIAL_COPY (299)。"
-
在任何情况下,您都将窗口的 线程 id 传递给
Wnd->set_pid(),而您应该传递它的 进程 id。此外,您应该将EnumProcessModules()/GetModuleBaseName()替换为GetModuleFileNameEx()、GetProcessImageFileName()或QueryFullProcessImageName()(后两者与PROCESS_QUERY_LIMITED_INFORMATION一起使用,与PROCESS_QUERY_INFORMATION相比,您更有可能获得访问权限) )。
标签: c++ windows winapi access-rights