我正在研究 vc++ 中的后台应用程序
如何获取当前应用程序的进程名称,例如“Iexplore”用于使用 Internet Explorer,“Skype”用于带有磁贴“Skype - 用户名”的窗口,“Explorer”用于使用 Windows 资源管理器?
我引用了此链接,但出现 Null 错误: http: //www.codeproject.com/Articles/14843/Finding-module-name-from-the-window-handle
我正在研究 vc++ 中的后台应用程序
如何获取当前应用程序的进程名称,例如“Iexplore”用于使用 Internet Explorer,“Skype”用于带有磁贴“Skype - 用户名”的窗口,“Explorer”用于使用 Windows 资源管理器?
我引用了此链接,但出现 Null 错误: http: //www.codeproject.com/Articles/14843/Finding-module-name-from-the-window-handle
这可以使用以下代码完成:
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 路径)
根据一些研究(感谢@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
是我程序中的一个参数。如果您在尝试此代码时遇到任何问题,请随时告诉我。