如何检查当前具有焦点的进程
之前已经提出过这个问题,以下是我尝试过的其他一些问题,但实施失败了:
确定当前应用程序是否已激活(具有焦点)
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();