在vc ++中获取活动的processname

时间:2013-02-07 06:52:33

标签: c++ visual-c++

正在使用vc ++中的后台应用程序

如何获取当前应用程序的进程名称,例如“Iexplore”用于使用Internet Explorer,“Skype”用于使用“Skype - 用户名”,“资源管理器”用于使用Windows资源管理器的窗口?

我引用了这个链接,但我收到Null错误:http://www.codeproject.com/Articles/14843/Finding-module-name-from-the-window-handle

2 个答案:

答案 0 :(得分:4)

可以使用以下代码完成:

bool GetActiveProcessName(TCHAR *buffer, DWORD cchLen)
{
    HWND fg = GetForegroundWindow();
    if (fg)
    {
        DWORD pid;
        GetWindowThreadProcessId(fg, &pid);
        HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
        if (hProcess)
        {
            BOOL ret = QueryFullProcessImageName(hProcess, 0, buffer, &cchLen);
            //here you can trim process name if necessary
            CloseHandle(hProcess);
            return (ret != FALSE);
        }
    }
    return false;
}

然后

TCHAR buffer[MAX_PATH];
if(GetActiveProcessName(buffer, MAX_PATH))
{
    _tprintf(_T("Active process: %s\n"), buffer);
}
else
{
    _tprintf(_T("Cannot obtain active process name.\n"));
}

请注意, QueryFullProcessImageName 功能仅在Windows Vista上可用,在早期系统上您可以使用 GetProcessImageFileName (它类似,但需要与psapi.dll连接并返回设备路径而不是通常的win32路径)

答案 1 :(得分:0)

我在QT5 / C ++项目中使用此代码,根据一些研究成功获得当前活动的进程名称和窗口标题(感谢@dsi)。只是想分享代码,以便其他人从中受益。

std::unique_ptr

并将以下内容放入方法中:

# Put this two declarations in the top of the CPP file
#include <windows.h>
#pragma comment(lib, "user32.lib")

此代码可能无法直接编译,因为// get handle of currently active window HWND hwnd = GetForegroundWindow(); if (hwnd) { // Get active app name DWORD maxPath = MAX_PATH; wchar_t app_path[MAX_PATH]; DWORD pid; GetWindowThreadProcessId(hwnd, &pid); HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); if (hProcess) { QueryFullProcessImageName(hProcess, 0, app_path, &maxPath); // here you can trim process name if necessary CloseHandle(hProcess); QString appPath = QString::fromWCharArray(app_path).trimmed(); QFileInfo appFileInfo(appPath); windowInfo.appName = appFileInfo.fileName(); } // Get active window title wchar_t wnd_title[256]; GetWindowText(hwnd, wnd_title, sizeof(wnd_title)); windowInfo.windowTitle = QString::fromWCharArray(wnd_title); } 是我程序中的参数。如果您在尝试此代码时遇到任何问题,请随时通知我。