目标:利用Windows事件/挂钩立即检测Windows前景窗口更改(焦点更改)而不使用计时器。这是一个全局宏程序,我希望特定的击键/鼠标按钮单击只有在某个窗口处于活动状态时才能注册事件(而不是每次按下键或鼠标键时都检查前景窗口)。
我知道如何使用GetForegroundWindow获取前景窗口的句柄和GetActiveWindowText来获取标题,我知道我可以在计时器中使用这些来保持它不断更新。但是,如果可能的话,我宁愿使用Windows消息来完成此操作(本网站上的其他相关主题使用了定时器,而不是Windows消息)。
我已经尝试过WM_ACTIVATE,WM_ACTIVATEAPP和WM_SHOWWINDOW,但这些似乎并不是全局的(我认为只有像键盘钩子那样的低级钩子可以是全局的),所以如果我改变窗口焦点,它们就不会触发谷歌Chrome到计算器或记事本。我是否需要注册一个钩子或东西才能使用这些消息的全局形式,或者这实际上是不可能的?
目标就是这样:
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
Select Case m.Msg
Case WM_ACTIVATE 'Whatever message that can be used to determine windows focus change
Dim caption As New System.Text.StringBuilder(256)
Dim hWnd As IntPtr = GetForegroundWindow()
GetActiveWindowText(hWnd, caption, caption.Capacity)
Me.Text = caption.ToString
End Select
End Sub