2012-09-11 3 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를 트리거 할 수 있습니다 - 형태로 외부 키보드 만 사용. 시작 버튼을 마우스로 클릭해도 아무런 반응이 없습니다. 어디서나 OS에서 양식 외부 -

If GetKeyState(1) < 0 Then 

내가 마우스 왼쪽 버튼을 클릭하여있는 MsgBox를 트리거 할 수 있습니다 : 나는 같은 라인을 변경하는 경우

.

그러나 나는 시작 버튼의 왼쪽 마우스 클릭으로 해석됩니다 제가 인식 결합 할 때 :

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

아무런 변화가 없습니다. 마우스가 시작 버튼을 클릭 할 때 MsgBox가 트리거되도록하려면 어떻게해야합니까?

---------------------------------- 질문 부록 ---------- ------------------------------

이제는 키보드의 키 대 버튼의 차이점을 이해했습니다. 화면. Windows 키가 시작 단추를 트리거하지만 GetKeyState는 키보드의 입력 만 허용합니다. 이름으로 GetKeyState는 키보드의 키 상태와 관련이있는 것 같습니다. 그러나 키보드와 마우스를 모두 포함하는 GetKeyState 함수를 온라인에서 볼 수 있습니다.

그러나 GetKeyState가 저를 내 목적지로 데려 가지 않을 것이라고 결론을 지어야합니다. Window Detective라고 불리는 Spy ++와 비슷한 프로그램을 실행 시켰고 시작 버튼을 Parent : Shell_traywnd 및 Child : Button으로 식별했습니다.

myParent =를 FindWindow (워드 vb N ull "Shell_traywnd") 는 myChild = FindWindowEx (myParent, 0, "버튼", 워드 vb N ull)

: 그래서 그러므로

, 나는 다음과 같은 것을 만드는 것이 나에게 보일 수있을 것입니다

질문은 다음과 같습니다. - 자녀가 클릭되면 어떻게 감지합니까? 이 경우 시작 버튼은 핸들이라고합니까? 아니면 창문? 또한 X/Y를 사용하여 마우스 위치를 알았지 만 시작 버튼을 Windows OS에서 자유롭게 재배치 할 수 있으므로 사용하고 싶지 않습니다.

답변

1

당신의 가정은 잘못된 : 91 (0x5B)의 GetKeyState 매개 변수는 left windows key on the keyboard 아닌 화면의 시작 버튼을 의미합니다. 마우스 클릭이 발생하는 곳을 확인해야 할 것으로 판단됩니다.

저는 전문가가 아니지만 Visual Studio와 함께 제공되는 Spy ++를 사용하여 시작 버튼 클릭과 관련된 Windows 메시지를 들여다 볼 수 있습니다.

+0

안녕하세요 SSS, 위의 질문에 대한 내 부록을 검토 할 수 있습니까? 나는 당신의 의견에 크게 감사 할 것입니다. – reversehalo

+0

나는 이것에 대한 전문가가 아니지만이 (dodgy!) 링크를 찾았습니다. 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

논리 "or"를 사용해 보셨습니까?

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를 사용하면 같은 효과가 나타나지 않으므로 ... 안부 Logged – BrOSs

관련 문제