如何监控焦点变化?

好吧有时候我正在打字,很少发生什么东西偷了重点,我读了一些解决方案(甚至是VB手表),但它们并不适用于我。 是否有任何窗口’手柄’可以处理任何焦点变化?

无论在哪种语言,C,C ++,VB.NET,C#,Anything .NET或Windows相关,Batch,PoweShell,VBS Script ……只要我能够监控每个焦点变化并将其记录到文件/ cmd窗口/可视窗口。

就像是:

void event_OnWindowsFocusChange(int OldProcID, int NewProcID); 

会非常有用的。 或者也许有这方面的工具(我找不到?)

一种方法是使用Windows UI Automation API。 它揭示了一个全球焦点变化的事件。 这是我想出的一个快速示例(在C#中)。 注意,您需要添加对UIAutomationClient和UIAutomationTypes的引用。

 using System.Windows.Automation; using System.Diagnostics; namespace FocusChanged { class Program { static void Main(string[] args) { Automation.AddAutomationFocusChangedEventHandler(OnFocusChangedHandler); Console.WriteLine("Monitoring... Hit enter to end."); Console.ReadLine(); } private static void OnFocusChangedHandler(object src, AutomationFocusChangedEventArgs args) { Console.WriteLine("Focus changed!"); AutomationElement element = src as AutomationElement; if (element != null) { string name = element.Current.Name; string id = element.Current.AutomationId; int processId = element.Current.ProcessId; using (Process process = Process.GetProcessById(processId)) { Console.WriteLine(" Name: {0}, Id: {1}, Process: {2}", name, id, process.ProcessName); } } } } } 

您可以使用钩子监视焦点更改。 SetWindowsHookEx(),使用WH_SHELL钩子完成它。 回调获取HSHELL_WINDOWACTIVATED通知。

这很容易上手,特别是在托管语言中,因为它需要一个可以注入的DLL。 你也不能可靠地分辨出预期的焦点变化或推动窗口的过程与偷走焦点之间的区别。 哪个Windows试图阻止,但有一个名为AttachThreadInput()的后门欺骗了该代码。

要知道这个过程是什么,这绝非易事。 毕竟,它试图激活其中一个窗口。 卸载该程序是一个简单而且最好的解决方案。