正在使用vc ++中的后台应用程序
如何获取当前应用程序的进程名称,例如“Iexplore”用于使用Internet Explorer,“Skype”用于使用“Skype - 用户名”,“资源管理器”用于使用Windows资源管理器的窗口?
我引用了这个链接,但我收到Null错误:http://www.codeproject.com/Articles/14843/Finding-module-name-from-the-window-handle
答案 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);
}
是我程序中的参数。如果您在尝试此代码时遇到任何问题,请随时通知我。