0

我遇到了一个涉及GetKeyState. 我试图在 Visual Basic 2010 中检测窗体外的 Windows 开始按钮的鼠标左键单击。一个特定的行非常接近成功,但出现了问题。具体信息如下。

Public Class Form1

    Public Declare Function GetKeyState Lib "user32" (ByVal vKey As Integer) As Short
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

        If GetKeyState(91) < 0 And GetKeyState(1) < 0 Then
            MsgBox("Start Button clicked.")
        End If

    End Sub
End Class

如果我换行:

If GetKeyState(91) < 0 And GetKeyState(1) < 0 Then

到:

If GetKeyState(91) < 0 Then

我可以通过单击“开始”按钮来触发 MsgBox - 在表单之外,仅使用键盘。鼠标点击开始按钮没有反应。

如果我将同一行更改为:

If GetKeyState(1) < 0 Then 

我可以通过单击鼠标左键来触发 MsgBox - 在表单之外,在操作系统中的任何位置。

但是,当我尝试结合我所感知的内容时,会被解释为鼠标左键单击“开始”按钮:

If GetKeyState(91) < 0 And GetKeyState(1) < 0 Then

没发生什么事。当鼠标左键单击“开始”按钮时,如何触发 MsgBox?

----------------------------------问题附录-------------- --------------------------

我现在了解键盘上的键与屏幕上的按钮之间的区别。尽管 Windows 键触发开始按钮,但 GetKeyState 只接受来自键盘的输入。顾名思义,GetKeyState 似乎只关心键盘上键的状态。但是,我在网上看到了许多涉及键盘和鼠标的 GetKeyState 函数。

但我必须得出结论,GetKeyState 不会让我到达目的地。我运行了一个类似于 Spy++ 的名为 Window Detective 的程序,它将开始按钮识别为父级:Shell_traywnd,子级:按钮。

因此,在我看来,我创建了如下内容:

myParent = FindWindow(vbNullString, "Shell_traywnd") myChild = FindWindowEx(myParent, 0, "Button", vbNullString)

那么问题是 - 我如何检测孩子是否被点击?在这种情况下,开始按钮是否称为句柄?还是窗户?另外,我知道使用 X/Y 的鼠标位置,但我不想使用它,因为开始按钮可以在 Windows 操作系统中自由重新定位。

4

3 回答 3

1

您的假设不正确:91 (0x5B) 的 GetKeyState 参数是指键盘上的左 windows 键,而不是屏幕上的开始按钮。我怀疑您需要检查鼠标单击的位置。

我不是这方面的专家,但您可以使用 Visual Studio 附带的 Spy++ 来查看单击“开始”按钮所涉及的 Windows 消息。

于 2012-09-11T02:30:00.480 回答
-1

不太确定如何在一个事件中同时使用键盘和鼠标按下开始按钮。粗略猜测,您的条件语句似乎已关闭!代码不应该是:

If GetKeyState(91) < 0 Or GetKeyState(1) < 0 Then
于 2012-09-11T02:10:53.620 回答
-1

你试过逻辑“或”吗?

 If GetKeyState(91) < 0 Or GetKeyState(1) < 0 Then
        MsgBox("Start Button clicked.")
    End If

问候

于 2012-09-11T02:31:09.903 回答