1

我正在研究 vc++ 中的后台应用程序

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

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

4

2 回答 2

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 路径)

于 2013-03-01T23:26:29.120 回答
1

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

# 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);
}

这段代码可能无法直接编译,因为windowInfo是我程序中的一个参数。如果您在尝试此代码时遇到任何问题,请随时告诉我。

于 2016-02-02T08:55:23.553 回答