In the end, I found a way to do this, so I'm going to answer my own question, so maybe someone in the future with the same problem might find it useful.
This is a class with WinApiFunctions:
public class WinAPIFunctions { //Used to get Handle for Foreground Window [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr GetForegroundWindow(); //Used to get ID of any Window [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId); public delegate bool WindowEnumProc(IntPtr hwnd, IntPtr lparam); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc callback, IntPtr lParam); public static int GetWindowProcessId(IntPtr hwnd) { int pid; GetWindowThreadProcessId(hwnd, out pid); return pid; } public static IntPtr GetforegroundWindow() { return GetForegroundWindow(); } }
And this is the class that I used to check if it would work. I used it in a simple console program that simply writes the name of a process that has the current focus:
class FindHostedProcess { public Timer MyTimer { get; set; } private Process _realProcess; public FindHostedProcess() { MyTimer = new Timer(TimerCallback, null, 0, 1000); Console.ReadKey(); } private void TimerCallback(object state) { var foregroundProcess = Process.GetProcessById(WinAPIFunctions.GetWindowProcessId(WinAPIFunctions.GetforegroundWindow())); if (foregroundProcess.ProcessName == "ApplicationFrameHost") { foregroundProcess = GetRealProcess(foregroundProcess); } Console.WriteLine(foregroundProcess.ProcessName); } private Process GetRealProcess(Process foregroundProcess) { WinAPIFunctions.EnumChildWindows(foregroundProcess.MainWindowHandle, ChildWindowCallback, IntPtr.Zero); return _realProcess; } private bool ChildWindowCallback(IntPtr hwnd, IntPtr lparam) { var process = Process.GetProcessById(WinAPIFunctions.GetWindowProcessId(hwnd)); if (process.ProcessName != "ApplicationFrameHost") { _realProcess = process; } return true; } }
source share