如何检查当前具有焦点的进程

之前已经提出过这个问题,以下是我尝试过的其他一些问题,但实施失败了:

确定当前应用程序是否已激活(具有焦点)

C#:检测哪个应用程序具有焦点

如何获得当前关注的应用程序名称

我目前无法正常工作:

private class User32 { [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int GetWindowThreadProcessId(IntPtr handle, out int processId); } public static bool ApplicationIsActivated() { try { var activatedHandle = User32.GetForegroundWindow(); if (activatedHandle == IntPtr.Zero) { // No window is currently activated return false; } var procId = Process.GetCurrentProcess().Id; int activeProcId; User32.GetWindowThreadProcessId(activatedHandle, out activeProcId); return activeProcId == procId; } catch(Exception ex) { Console.WriteLine(ex); } } static void Main(string[] args) { try { while (true) { if (ApplicationIsActivated()) CaptureApplication(); Thread.Sleep(3000); } } catch (Exception ex) { Console.WriteLine(ex); } } 

我要检查的是WINWORD进程当前是否有焦点。 我的程序中的其他地方有一些实际使用Process.GetProcessesByName("WINWORD")[0]; 但我无法弄清楚如何检查WINWORD是否具有焦点。

编辑:调试时我发现activeProcID确实有正确的进程ID,但procID包含我在CMD中运行tasklist /svc时看不到的进程ID。

这是我的解决方案:

 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] public static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern int GetWindowThreadProcessId(IntPtr handle, out int processId); public static bool ApplicationIsActivated() { var activatedHandle = User32.GetForegroundWindow(); if (activatedHandle == IntPtr.Zero) { // No window is currently activated return false; } var procId = Process.GetCurrentProcess().Id; int activeProcId; User32.GetWindowThreadProcessId(activatedHandle, out activeProcId); string activeProcName = Process.GetProcessById(activeProcId).ProcessName.ToString(); if (activeProcName.Equals("WINWORD")) { return true; } else { return false; } } 

为何如此有效:

Process.GetProcessById(activeProcId).ProcessName.ToString();