2011-03-10 60 views
0

当我打开一个窗口它第一次有错误的标题(仍然没有更新)几秒钟后标题更新,有没有任何功能或实际的解决方案等待这样,然后我可以发送消息在某处当这种情况发生...如何等待窗口标题更新?

什么,我已经是一个CBT钩子,获取WPARAM当窗口激活,我需要等待这个WPARAM,成为真正的冠军(不是假的)

我可以把睡眠对于每个激活,但会减缓一切都下降。

回答

1

前提是你的目标窗口按照标准方法来更新它的标题的代码,会做,你可以添加一个钩抓标题发生变化的精确时刻。

要做到这一点,你需要添加一个Windows消息返回钩与SetWindowsHookEx,传递一个CallWndRetProc处理程序从您的代码由目标窗口消息处理程序接收Windows消息的完成时通知。

SetWindowsHookEx() @ MSDN
CallWndRetProc @ MSDN

你需要捕获Windows消息是WM_SETTEXT,它被送到触发一个窗口的默认文本/标题的变化。

WM_SETTEXT @ MSDN

如果你想在隔离测试,WM_SETTEXT是在调用SetWindowText改变窗口的文本/标题发出了隐含的信息。

SetWindowText() @ MSDN

此外,您还可能能够摆脱你的CBT钩子,因为WM_ACTIVATEWM_MOUSEACTIVATEWM_SETFOCUS可以被困用于捕获WM_SETTEXT相同钩。这些消息涵盖了各种级别的激活活动和窗口类型。

WM_ACTIVATE @ MSDN
WM_MOUSEACTIVATE @ MSDN
WM_SETFOCUS @ MSDN

最后,如果目标窗口为您创建一个窗口,并控制在自己的过程中,你可以简单地拦截这些窗口的消息,而不是使用挂钩。如果不可能使用可用的框架来拦截这些消息,则SetClassLongPtr也是另一种替代方法,可用于为该类型的窗口实现子类以允许您截取窗口消息。如果您使用此方法,则会将所有调用委托给原始Windows消息处理程序,并且仅在收到感兴趣的消息时从原始过程返回时才执行。

SetClassLongPtr() @ MSDN
WindowProc @ MSDN

1

这是我会怎么做它在C#:

建立一个监听TextChanged事件。

this.something.TextChanged += new System.EventHandler(something_TextChanged); 

然后设置任何你需要的时候文本更改

void something_TextChanged(object sender, System.EventArgs e) 
{ 
    // your code 
}