Connecting UWP apps hosted by ApplicationFrameHost to their real processes

前端 未结 4 1196
暗喜
暗喜 2021-02-08 00:30

I am working on an WPF application to monitor my activities on my computer. I use Process.GetProcesses() and some filtering to get the processes I am interested in

4条回答
  •  温柔的废话
    2021-02-08 01:07

    Chris, there is the alternative way which I have discovered trying to apply your solution to a related problem. While trying to analyse how the ApplicationFrameHost.exe-related stuff worked, I have stumbled upon the documented way of getting the true foreground window / thread and its process by passing 0 instead of the actual thread ID to GetGUIThreadInfo.

    It might not fully work for the edge-case scenarios of your problem, but I felt that this might be a useful contribution for people of the future who might face the same problems ;-)

    Here is the example of how this can be applied (pseudo C++'ish code):

    GUITHREADINFO gti = { sizeof(GUITHREADINFO) };
    GetGUIThreadInfo(0, >i); // <- note the `0`
    
    DWORD processId = 0;
    GetWindowThreadProcessId(gti.hwndFocus, &processId);
    
    const auto procName = Util::GetProcessName(processId);
    

    It solved my problem (obtaining the actual keyboard layout + finding the real foreground window) for all more-or-less common apps I have tested it against.

提交回复
热议问题