如何在vb.net中全局检测活动窗口更改?

时间:2013-12-12 14:56:03

标签: vb.net window wndproc

目标:利用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

0 个答案:

没有答案