用于检索当前使用的应用程序的功能

时间:2017-07-30 10:52:07

标签: c++ winapi

我正在编写一个函数来确定哪个应用程序(如果屏幕上没有显示任何窗口,则为桌面)是用户关注的。但是,它不适用于某些应用程序,例如任务管理器......实际上,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;
}

1 个答案:

答案 0 :(得分:0)

任务管理器和其他进程的运行权限比标准进程高。如果需要PROCESS_VM_READ权限,则还必须以管理员身份运行程序。这是仅在这些进程上失败的原因。