【问题标题】:C++ Getting the Name of a Process via ProcessIDC++ 通过 ProcessID 获取进程的名称
【发布时间】:2018-12-02 23:53:09
【问题描述】:

例如从 PID 10948 我想获取 firefox.exe 的进程名

我尝试过使用GetModuleFileNameExGetModuleFileNameGetProcessImageFileNameGetModuleBaseName,所有这些都会导致垃圾字符串,例如:╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ 7Σ

我的代码:

DWORD* thread = new DWORD;
TCHAR szName[_MAX_FNAME];
HANDLE processhandle = OpenProcess(PROCESS_QUERY_INFORMATION, false, GetWindowThreadProcessId(GetForegroundWindow(), thread));
GetProcessImageFileName(processhandle, szName, _MAX_FNAME);
strrchr(szName, '\\');

最初我尝试使用 python 使用 win32gui 库使用进程的句柄来执行此操作,它有效,但它无法找到命令提示符句柄。我不在乎使用哪种语言来解决识别当前正在使用的程序的问题,只要我能够找到我可能使用的所有程序的名称即可。

【问题讨论】:

标签: python c++ winapi process win32gui


【解决方案1】:

OpenProcess() 如果失败则返回NULL。致电GetLastError() 了解原因。与GetProcessImageFileName() 相同。

另外,请尝试改用PROCESS_QUERY_LIMITED_INFORMATION,因为它需要的权限更少。

此外,您应该在填充 szName 缓冲区之前将其清零。

另外,您无需使用newGetWindowThreadProcessId() 分配DWORD

试试这个:

DWORD threadid;
DWORD processid = GetWindowThreadProcessId(GetForegroundWindow(), &threadid);
HANDLE processhandle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processid);
if (!processhandle) {
    // handle error as needed...
}
else {
    TCHAR szName[_MAX_FNAME] = {};
    if (!GetProcessImageFileName(processhandle, szName, _MAX_FNAME)) {
        // handle error as needed...
    }
    // ...
    CloseHandle(processhandle);
}

【讨论】:

  • 另外,您应该在填充 szName 缓冲区之前将其清零 - 这是唯一的参数。我们当然可以,但不需要这样做。即使想要这样做(实际上不需要)也可以例如将 1 设置为零 - *szName=0 only
  • @RbMm 我的意思是,GetProcessImageFileName 不会将缓冲区归零,所以如果失败,如果你自己不归零然后忽略返回值,你最终会得到垃圾,就像 OP 最初所做的那样。
  • 需要检查返回值,就像在你的代码中一样,如果失败,就不要使用它。
猜你喜欢
  • 2023-03-17
  • 2011-03-26
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多