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