我正在编写一个函数来确定哪个应用程序(如果屏幕上没有显示任何窗口,则为桌面)是用户关注的。但是,它不适用于某些应用程序,例如任务管理器......实际上,OpenProcess
函数(请参阅下面的代码)返回无效句柄。
目前,我认为桌面仍然是焦点,但我希望能够检索任务管理器的名称,因为我确信其他应用程序的行为方式相同。
任何想法我怎么能这样做?此外,如果你知道一个更好的方式(我确定有)确定用户是否在桌面上而不是检查窗口标题是否为空,我很想听到它。
感谢。
std::wstring GetForegroundAppName() {
HWND hwnd = GetForegroundWindow(); //HWND is a handle to a Window while HANDLE is a handle to an object
HANDLE hprocess;
//HWND hwndbis = GetDesktopWindow();
int titleSize = GetWindowTextLength(hwnd);
const size_t size = 500;
std::wstring appPath(size, '\0');
std::wstring appName;
DWORD processID;
int nbCharRetrieved;
//
//Find the path of the application being used
//
GetWindowThreadProcessId(hwnd, &processID);
hprocess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, processID);
nbCharRetrieved = GetModuleFileNameEx(hprocess, NULL, &appPath[0], size);
//
//Do some checkings
//
if (nbCharRetrieved == 0) {
//throw ?
appPath.erase();
}
else if (nbCharRetrieved == size) {
//throw ?
}
//
//Fill in the name of the application being used or desktop.
//
int PosLastOccurence = appPath.rfind(L"\\", appPath.size());
appName = appPath.substr(PosLastOccurence + 1, appPath.size()); //We don't care about the '\0' char
if ((appName.empty() == true) || (titleSize == 0)) { //The user is currently on the desktop or the application being used couldn't be retrieved
appName = L"Desktop";
}
return appName;
}
答案 0 :(得分:0)
任务管理器和其他进程的运行权限比标准进程高。如果需要PROCESS_VM_READ权限,则还必须以管理员身份运行程序。这是仅在这些进程上失败的原因。