2012-09-11 98 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