当我打开一个窗口它第一次有错误的标题(仍然没有更新)几秒钟后标题更新,有没有任何功能或实际的解决方案等待这样,然后我可以发送消息在某处当这种情况发生...如何等待窗口标题更新?
什么,我已经是一个CBT钩子,获取WPARAM当窗口激活,我需要等待这个WPARAM,成为真正的冠军(不是假的)
我可以把睡眠对于每个激活,但会减缓一切都下降。
当我打开一个窗口它第一次有错误的标题(仍然没有更新)几秒钟后标题更新,有没有任何功能或实际的解决方案等待这样,然后我可以发送消息在某处当这种情况发生...如何等待窗口标题更新?
什么,我已经是一个CBT钩子,获取WPARAM当窗口激活,我需要等待这个WPARAM,成为真正的冠军(不是假的)
我可以把睡眠对于每个激活,但会减缓一切都下降。
前提是你的目标窗口按照标准方法来更新它的标题的代码,会做,你可以添加一个钩抓标题发生变化的精确时刻。
要做到这一点,你需要添加一个Windows消息返回钩与SetWindowsHookEx
,传递一个CallWndRetProc
处理程序从您的代码由目标窗口消息处理程序接收Windows消息的完成时通知。
SetWindowsHookEx() @ MSDN
CallWndRetProc @ MSDN
你需要捕获Windows消息是WM_SETTEXT
,它被送到触发一个窗口的默认文本/标题的变化。
如果你想在隔离测试,WM_SETTEXT
是在调用SetWindowText
改变窗口的文本/标题发出了隐含的信息。
此外,您还可能能够摆脱你的CBT钩子,因为WM_ACTIVATE
,WM_MOUSEACTIVATE
和WM_SETFOCUS
可以被困用于捕获WM_SETTEXT
相同钩。这些消息涵盖了各种级别的激活活动和窗口类型。
WM_ACTIVATE @ MSDN
WM_MOUSEACTIVATE @ MSDN
WM_SETFOCUS @ MSDN
最后,如果目标窗口为您创建一个窗口,并控制在自己的过程中,你可以简单地拦截这些窗口的消息,而不是使用挂钩。如果不可能使用可用的框架来拦截这些消息,则SetClassLongPtr
也是另一种替代方法,可用于为该类型的窗口实现子类以允许您截取窗口消息。如果您使用此方法,则会将所有调用委托给原始Windows消息处理程序,并且仅在收到感兴趣的消息时从原始过程返回时才执行。
这是我会怎么做它在C#:
建立一个监听TextChanged事件。
this.something.TextChanged += new System.EventHandler(something_TextChanged);
然后设置任何你需要的时候文本更改
void something_TextChanged(object sender, System.EventArgs e)
{
// your code
}