2012-09-11 58 views
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 - 形式外,在OS的任何地方。

然而,当我尝试结合我所认为将被解释为开始按钮的鼠标左键点击:

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

什么也没有发生。我该如何做到这一点,当鼠标左键单击“开始”按钮时,MsgBox会被触发?

---------------------------------- Question Addendum ---------- ------------------------------

我现在明白了键盘上的按键与按钮之间的区别屏幕。尽管Windows键会触发开始按钮,但GetKeyState只接受来自键盘的输入。按名称看来,GetKeyState似乎只关心键盘上按键的状态。但是,我看到许多GetKeyState函数在线,包括键盘和鼠标。

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

因此,因此,它似乎对我来说,我创建类似以下内容:

myParent = FindWindow函数(vbNullString, “Shell_traywnd”) myChild = FindWindowEx(myParent,0, “按钮”,vbNullString)

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

回答

1

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

我没有这方面的专家,但你可以使用间谍++与Visual Studio中的参与单击开始按钮,Windows消息偷看。

+0

你好SSS,你能回顾一下我对上述问题的附录吗?我将非常感谢您的意见。 – reversehalo

+0

我没有这方面的专家,但我发现这个(躲闪!)链接:http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=9370&lngWId=3 – SSS

+0

HTTP:// www.pinvoke.net可能也有帮助 – SSS

-1

不太清楚在一次事件中如何用键盘和鼠标按下启动按钮。粗略猜测,你的条件陈述似乎是关闭的!如果不是代码阅读:

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

我认为这是错误的。 GetKeyState(91)引用键盘上左侧窗口键的状态,而GetKeyState(1)引用左侧鼠标键的状态。使用OR只意味着你捕获了其中一个,而不是所需的“用鼠标左键单击开始按钮”。 – SSS

+0

@SSS - 很酷。听起来不错。感谢您的澄清。 :thumbsup: – enhzflep

-1

你试图用逻辑“或”?

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

问候

+0

我认为这是错误的。 GetKeyState(91)引用键盘上左侧窗口键的状态,而GetKeyState(1)引用左侧鼠标键的状态。使用OR只意味着你捕获了其中一个,而不是所需的“用鼠标左键单击开始按钮”。 – SSS

+0

我没有看到有人已经“回答”的问题(在或顺理成章的事情),但你是正确的关于函数GetKeyState(91)。因为使用ctrl + esc不会产生相同的效果 – BrOSs