如何等待窗口标题更新?

时间:2011-03-10 02:41:58

标签: c windows winapi

当我打开一个窗口时,它会在几秒钟的标题更新后首先出现错误的标题(仍然没有更新),是否有任何功能或实用的解决方案等待这一点然后我可以在发生这种情况时在某处发送消息...

我所拥有的是一个在窗口激活时获取wparam的cbt钩子,我需要等待这个wparam成为真正的标题(不是假的)

我可以为每次激活都进行一次睡眠,但这会减慢一切。

2 个答案:

答案 0 :(得分:1)

以下是我在c#中的表现:

为textchanged事件设置侦听器。

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

然后设置代码,该代码将在文本更改时执行您需要的任何操作

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

答案 1 :(得分:1)

如果您的目标窗口遵循标准方法来更新其标题,您可以添加一个钩子来捕捉标题更改时的精确时刻。

为此,您需要添加一个带有SetWindowsHookEx的Windows消息返回钩子,从您的代码中传递一个CallWndRetProc处理程序,以便在目标窗口的消息处理程序完成Windows消息后接收通知

SetWindowsHookEx() @ MSDN
CallWndRetProc @ MSDN

您需要捕获的Windows消息是WM_SETTEXT,它会被发送以触发窗口默认文本/标题的更改。

WM_SETTEXT @ MSDN

如果您希望单独测试,WM_SETTEXT是在调用SetWindowText时发送的隐式消息,用于更改窗口文本/标题。

SetWindowText() @ MSDN

此外,您也可以摆脱cbt挂钩,因为WM_ACTIVATEWM_MOUSEACTIVATEWM_SETFOCUS可以使用用于捕获{{1}的相同挂钩来捕获}}。这些消息涵盖了各种级别的激活活动和Windows类型。

WM_ACTIVATE @ MSDN
WM_MOUSEACTIVATE @ MSDN
WM_SETFOCUS @ MSDN

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

SetClassLongPtr() @ MSDN
WindowProc @ MSDN