如何检测鼠标单击开始按钮?

时间:2012-09-11 02:03:05

标签: windows vb.net

我遇到一个涉及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 Key触发了“开始”按钮,但GetKeyState仅接受来自键盘的输入。按名称,看起来GetKeyState只关注键​​盘上的键状态。但是,我在网上看到了许多涉及键盘和鼠标的GetKeyState函数。

但我必须得出结论,GetKeyState不会让我到达目的地。我运行了一个类似于Spy ++的程序,名为Window Detective,它将Start Button标识为Parent:Shell_traywnd和child:Button。

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

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

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

3 个答案:

答案 0 :(得分:1)

您的假设不正确:GetKeyState参数91(0x5B)是指left windows key on the keyboard,而不是屏幕上的开始按钮。我怀疑你需要检查鼠标点击的位置。

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

答案 1 :(得分:-1)

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

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

答案 2 :(得分:-1)

你试过逻辑“或”吗?

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

此致