如果是窗口,例如Firefox,改变它的标题,从Firefox到Stack Overflow – Firefox然后我希望我的应用程序记录Firefox改变了它的标题.
这可能不使用钩子和循环(EnumWindows)?如果只能用钩子做什么钩子?
解决方法
WinEvents是去这里的方式.您需要的API是
SetWinEventHook() – 如果您关心特定窗口,请使用GetWindowThreadProcessId()获取HWND的threadId,然后仅侦听来自该特定线程的事件.对于窗口标题更改,您将需要EVENT_OBJECT_NAMECHANGE事件.
您可以挂钩“在上下文中”或“在上下文中” – 后者是最简单的,并且意味着事件被传递回您自己的进程,因此您不需要单独的DLL – 这使得它可以执行它全部用C#;但是调用SetWinEventHook的线程必须有一个消息循环(GetMessage / TranslateMessage / DispatchMessage),因为事件是在幕后使用一种消息形式传递的.
在WinEvent回调中,您需要检查HWND是否是您关心的那个,因为您将获得该目标线程上任何UI的名称更改,可能包括子窗口名称更改或其他您不关心的内容关心.
–
顺便说一句,您可以查看this answer以获取使用WinEvents的一些示例C#代码;它正在使用它们来跟踪桌面上所有窗口的前景窗口变化;但是,我们应该采取上面列出的一些简单修改来跟踪特定窗口上的名称更改.