嗯,有时候我在打字,很少会有什么东西偷走焦点,我读了一些解决方案(甚至是VB手表),但它们不适用于我。是否有任何窗口范围的‘处理’,以处理任何焦点的变化?
不管是哪种语言,C,C++,VB.NET,C#,任何.NET或windows相关的东西,批处理,PoweShell,VBS Script……只要我能够监视每个焦点变化并将其记录到文件/cmd窗口/可视窗口中。
类似于:
void event_OnWindowsFocusChange(int OldProcID, int NewProcID);将是非常有用的。或者可能已经有了解决这个问题的工具(我找不到?)
发布于 2012-07-30 05:04:15
一种方法是使用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);
}
}
}
}
}发布于 2012-07-30 02:13:36
你可以用一个钩子来监控焦点的变化。使用WH_SHELL钩子的SetWindowsHookEx()可以完成这项任务。该回调获取HSHELL_WINDOWACTIVATED通知。
这并不容易,特别是在托管语言中,因为它需要一个可以注入的DLL。您也无法可靠地区分预期的焦点更改或进程推入窗口并窃取焦点之间的区别。这是Windows试图阻止的,但有一个名为AttachThreadInput()的后门可以欺骗这些代码。
这并不难看出是什么进程做到了这一点。毕竟,它试图激活它的一个窗口。卸载该程序是最简单也是最好的修复方法。
https://stackoverflow.com/questions/11711400
复制相似问题