C++ 在vc+中获取活动进程名+;

C++ 在vc+中获取活动进程名+;,c++,visual-c++,C++,Visual C++,我正在vc做一个背景应用程序++ 如何获取当前应用程序的进程名,例如使用Internet Explorer的“Iexplore”,使用分片“Skype-用户名”的窗口的“Skype”,使用windows Explorer的“Explorer” 我引用了此链接,但出现空错误:这可以使用以下代码完成: bool GetActiveProcessName(TCHAR *buffer, DWORD cchLen) { HWND fg = GetForegroundWindow(); if

我正在vc做一个背景应用程序++

如何获取当前应用程序的进程名,例如使用Internet Explorer的“Iexplore”,使用分片“Skype-用户名”的窗口的“Skype”,使用windows Explorer的“Explorer”


我引用了此链接,但出现空错误:

这可以使用以下代码完成:

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

这可以使用以下代码完成:

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

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

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

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

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

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

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

您想要与特定窗口句柄关联的可执行文件的名称吗?如果我使用“char-loaded_-file_-name[MAX_-path];GetModuleFileName(NULL,loaded_-file_-name,MAX_-path);”我想从后台获取应用程序名称,意味着无论我使用什么应用程序,我都应该获得exe名称。您链接的文章准确地描述了您的要求。你能引用你的代码版本并注释你得到空值的确切位置吗?以及任何其他调试信息,例如,当您获得空值时从
GetLastError
获得的信息?如果您想要与特定窗口句柄关联的可执行文件的名称,则可能存在重复?如果我使用“char-loaded_file_name[MAX_path];GetModuleFileName(NULL,loaded_file_name,MAX_path);”将获得完整路径我想从后台获取应用程序名,这意味着无论我使用什么应用程序,我都应该获取exe名。您链接的文章准确地描述了您的要求。你能引用你的代码版本并注释你得到空值的确切位置吗?以及任何其他调试信息,例如当您获得该空值时从
GetLastError
获得的信息?可能是