我遇到一个涉及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操作系统中自由重新定位。
答案 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
此致