Seite 1 von 1

If GetAsyncKeyState_(#VK_LBUTTON) ...

Verfasst: 17.03.2012 15:30
von Delle
Hallo,

ich frage systemweit ab, ob die linke Maustaste geklickt wurde:

Code: Alles auswählen

If GetAsyncKeyState_(#VK_LBUTTON)

Debug "klick"

EndIf
Wenn der User die Maustaste allerdings länger gedrückt hält, dann erscheint mehrmals die Debug-Ausgabe.

Wie kann ich mittels API abfragen ob die Taste losgelassen wurde?

Sowas in der Art:

Code: Alles auswählen

If GetAsyncKeyState_(#VK_LBUTTON)

 Repeat:Until GetAsyncKeyState_(#VK_LBUTTON_UP)

 Debug "klick"

EndIf

Re: If GetAsyncKeyState_(#VK_LBUTTON) ...

Verfasst: 17.03.2012 15:36
von RSBasic
Wie möchtest du das ermitteln? Nur in deiner Anwendung oder überall?
Wenn nur in deiner Anwendung:

Code: Alles auswählen

Procedure WinCallback(hWnd, uMsg, wParam, lParam) 
  Select uMsg
    Case #WM_LBUTTONUP
      Debug "Linke Maustaste wurde gedrückt. (Losgelassen)"
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents 
EndProcedure 


If OpenWindow(0, 0, 0, 200, 100, "Messages", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget) 
  
  SetWindowCallback(@WinCallback())    ; Callback aktivieren
  
  Repeat 
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow 
        End 
    EndSelect 
  ForEver 
EndIf 
Überall:

Code: Alles auswählen

EnableExplicit

Define EventID
Define hhkLLMouse

Procedure MouseKeyHook(nCode, wParam, lParam)
  Select wParam
    Case #WM_LBUTTONUP
      Debug "Linke Maustaste wurde gedrückt. (Losgelassen)"
  EndSelect
  
  ProcedureReturn CallNextHookEx_(0, nCode, wParam, lParam)
EndProcedure

If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  hhkLLMouse = SetWindowsHookEx_(#WH_MOUSE_LL, @MouseKeyHook(), GetModuleHandle_(0), 0)
  
  Repeat
    EventID=WaitWindowEvent()
  Until EventID = #PB_Event_CloseWindow
EndIf

UnhookWindowsHookEx_(hhkLLMouse)

Re: If GetAsyncKeyState_(#VK_LBUTTON) ...

Verfasst: 17.03.2012 15:38
von Delle
Das &1 ist die Lösung :)

Code: Alles auswählen

If GetAsyncKeyState_(#VK_LBUTTON) &1

Debug "klick"

EndIf

Re: If GetAsyncKeyState_(#VK_LBUTTON) ...

Verfasst: 20.03.2012 00:09
von TheCube
Hallo, ich hänge mich hier an das Thema einfach mal dran .... und zwar wegen des Beispielcodes ("Überall-Abfrage")
von RSBasic mit diesem SetWindowsHookEx_ .

Ob und wie wäre es möglich ein Mausevent - wie z.B. eine Maustaste - auf Wunsch global wegzufiltern ?
(Anwendung z.B: Fehlbedienung bei abgeschaltetem Bildschirm vermeiden)

Ich gebe zu, diesmal habe ich es noch nicht selber versucht :oops: trotz ein paar gefundener C#-Schnipsel zum Thema.
.

Re: If GetAsyncKeyState_(#VK_LBUTTON) ...

Verfasst: 20.03.2012 00:36
von Delle
@TheCube:

Wieso machst Du nicht einfach während der "Bildschirmpause" ein leeres Fenster auf was alle Mauseingaben abfängt (bzw. einfach ignoriert)?

Re: If GetAsyncKeyState_(#VK_LBUTTON) ...

Verfasst: 21.03.2012 00:36
von TheCube
@Delle
Klar für den üblichen Bildschirmschoner gibts wohl dutzende bessere Methoden,
als mit Hooks herumzutricksen .... war ja nur ein Beispiel für ein z.B. hardwaremässig abgeschaltetes Display.
Ist eine reine HowToDo-Frage:
Wenn ich, warum nun auch immer, die Funktion einer Maustaste auf dem Desktop temporär unterbinden möchte,
aber ansonsten (Bewegung etc.) alles weiter wie üblich funktioniert.

Edit: Einen schönen Einstieg gibts u.A. hier :
http://www.purebasic.fr/english/viewtop ... mouse+hook
Meine Frage hat ich damit erledigt 8)