【问题标题】:Get ProcessName from Visual C++从 Visual C++ 获取 ProcessName
【发布时间】:2013-02-06 10:47:20
【问题描述】:

在 Visual C++ 中,我使用

获取当前窗口的标题
::GetWindowText(wnd, str, 290);

strcpy(curr_wnd_txt, str); 

但是我如何获取应用程序的进程名称,例如“Iexplore”用于使用 Internet Explorer,“Skype”用于带有磁贴“Skype - 用户名”的窗口,“Explorer”用于使用 Windows 资源管理器?

这是我尝试过的:

void CMainWndDlg::Monitor_ActiveWindowCaptions()
{
    HWND hwnd;
    DWORD process_id=0;
    GetWindowThreadProcessId(hwnd, &process_id);
    CString strEXEName = GetEXEName (process_id);
}

CString GetEXEName(DWORD dwProcessID)
{
DWORD aProcesses [1024], cbNeeded, cProcesses;
unsigned int i;

if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
    return "";

cProcesses = cbNeeded / sizeof(DWORD);

TCHAR szEXEName[MAX_PATH];
for (i = 0; i < cProcesses; i++)
{
    if (aProcesses [i] == dwProcessID)
    {
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                          PROCESS_VM_READ, FALSE, dwProcessID);
        if (NULL != hProcess)
        {
            HMODULE hMod;
            DWORD cbNeeded;
            if(EnumProcessModules(hProcess, &hMod, 
                                  sizeof(hMod), &cbNeeded))
            {
                GetModuleBaseName(hProcess, hMod, szEXEName, 
                    sizeof(szEXEName)/sizeof(TCHAR));
                return CString (szEXEName);
            }
        }
    }    
}
return "";
}

【问题讨论】:

  • 你不能。连微软都做不到。只需启动 IE 和任务管理器。在“任务”选项卡中显示 IE 的标题(=网页标题),在“进程”中显示 IExplore.exe。
  • 这就是我需要的。如果我可以将进程作为 iexplorer.exe 获取,那么我可以轻松地将其显示为 iexplorer

标签: c++ visual-c++


【解决方案1】:

GetModuleFileName() 可以用来获取当前进程的可执行文件的路径。

http://msdn.microsoft.com/en-gb/library/windows/desktop/ms683197(v=vs.85).aspx

【讨论】:

  • 这可能不是这里要问的。它从窗口的标题中获取可执行文件的名称
  • @Aniket:可能是,也许我应该评论这个问题并得到一些澄清。查看您的答案很有用:我不知道 GetModuleBaseName()。
【解决方案2】:

您必须枚举窗口,获取进程句柄,然后从下面的函数中获取可执行文件的名称。

#include "psapi.h"
#pragma comment(lib, "psapi.lib")

CString GetEXEName(DWORD dwProcessID)
{
    DWORD aProcesses [1024], cbNeeded, cProcesses;
    unsigned int i;

    //Enumerate all processes
    if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
        return NULL;

    // Calculate how many process identifiers were returned.
    cProcesses = cbNeeded / sizeof(DWORD);

    TCHAR szEXEName[MAX_PATH];
    //Loop through all process to find the one that matches
    //the one we are looking for
    for (i = 0; i < cProcesses; i++)
    {
        if (aProcesses [i] == dwProcessID)
        {
            // Get a handle to the process
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                              PROCESS_VM_READ, FALSE, dwProcessID);

            // Get the process name
            if (NULL != hProcess)
            {
                HMODULE hMod;
                DWORD cbNeeded;

                if(EnumProcessModules(hProcess, &hMod, 
                                      sizeof(hMod), &cbNeeded))
                {
                    //Get the name of the exe file
                    GetModuleBaseName(hProcess, hMod, szEXEName, 
                        sizeof(szEXEName)/sizeof(TCHAR));

                    return CString (szEXEName);
                }
            }
        }    
    }

    return NULL;
}

参考这里:http://www.codeproject.com/Articles/14843/Finding-module-name-from-the-window-handle

【讨论】:

  • 在“返回 NULL”中出现错误 - 多个构造函数适用于从 int 转换为 cstring
  • @user1441251 可以返回NULL,而不是返回""。我发布的代码是用 C 编译的,但是由于对 C++ 的严格类型检查,编译器会抱怨它。
  • 它运行良好,但出现另一个错误“错误 98 错误 LNK2019:未解析的外部符号”私有:类 ATL::CStringT> > thiscall CMainWndDlg::GetEXEName(unsigned long)" (?GetEXEName@CMainWndDlg@@AAE?AV?$CStringT@DV?$StrTraitMFC@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@K @Z) 在函数“private: static int __stdcall CMainWndDlg::EnumWindowsProc(struct HWND *,long)”中引用 (?EnumWindowsProc@CMainWndDlg@@CGHPAUHWND__@@J@Z) C:\Users\logid\Documents \Visual Studio 2012\Projects\Test\MainWnd\MainWndDlg.obj MainWnd"
  • 当我调用 CString strEXEName = GetEXEName (process_id); 时出现此错误;
  • 我可以看看你的源代码吗?只是这个函数和 EnumWindow 函数在 CMainWndDlg 类中是如何定义的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 2015-03-28
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多