Seite 1 von 1

Linke/rechte Maus Abfrage für Window (nicht Screen!)

Verfasst: 12.09.2006 22:36
von Delle
Hey,

ob die Maus in einem Window bewegt wurde, kann ich ja mittels DesktopMouseX() + DesktopMouseY() abfragen.

Wie aber ob die rechte oder linke Maus gedrückt wurde?

Also möglichst ohne die DirectX-Mouse-Lib...

Verfasst: 12.09.2006 23:08
von ts-soft
Unter Windows mit:
#WM_LBUTTONDOWN
#WM_LBUTTONUP
#WM_RBUTTONDOWN
#WM_RBUTTONUP

Verfasst: 12.09.2006 23:18
von Falko
Hier noch ein kleines Beispiel, vom Original, dessen Author unbekannt ist und ich etwas umgestellt habe.

Code: Alles auswählen

; Autor: ?
; Datum: ?
; Forum: ?
; Etwas vom Originalsource abgewandelt.
Global hhook
Procedure MouseProc(nCode, wParam, lParam)
  *ms.MOUSEHOOKSTRUCT = lParam
  SetGadgetText(0, "x: "+Str(*ms\pt\x))
  SetGadgetText(1, "y: "+Str(*ms\pt\y))
  If wParam = #WM_RBUTTONUP ; 205h
    SetGadgetText(2, "Rechte Maustaste wurde gedrückt")
  ElseIf wParam = #WM_LBUTTONUP  
    SetGadgetText(2, "Linke Maustaste wurde gedrückt")
   ElseIf wParam = #WM_MBUTTONUP
    SetGadgetText(2, "Mittlere Maustaste wurde gedrückt")
  EndIf
EndProcedure
Instance = GetModuleHandle_(0)
If OpenWindow(0, 0, 0, 300, 200, "Mouse hook example", #PB_Window_SystemMenu)
  WindowID = WindowID(0)
  If CreateGadgetList(WindowID)
    TextGadget(0, 4, 4, 48, 24, "x: ")
    TextGadget(1, 4, 32, 48, 24, "y: ")
    TextGadget(2, 4, 64,180,20,"")
  EndIf
  lpdwProcessId = GetWindowThreadProcessId_(WindowID, 0)
  hhook = SetWindowsHookEx_(#WH_MOUSE, @MouseProc(), hInstance, lpdwProcessId)
  Repeat
    EventID = WaitWindowEvent()
  Until EventID = #PB_Event_CloseWindow
EndIf
UnhookWindowsHookEx_(hhook)
End

Verfasst: 12.09.2006 23:29
von Delle
Ohne API gehen solche einfachen Abfragen also nicht mit PB4? :-/

Verfasst: 12.09.2006 23:42
von ts-soft
Delle hat geschrieben:Ohne API gehen solche einfachen Abfragen also nicht mit PB4? :-/
Nein, sind immer an Gadgets gebunden (EventType())

Hier noch ein einfaches Beispiel:

Code: Alles auswählen

If OpenWindow(0, #PB_Ignore, 0, 200, 200, "")
  Repeat
    Select WaitWindowEvent()
    
      Case #PB_Event_CloseWindow
        Break
        
      Case #WM_LBUTTONDOWN
        Debug "linke Maus gedrückt"
        
      Case #WM_LBUTTONUP
        Debug "linke Maustaste losgelassen"
        
    EndSelect
  ForEver
EndIf

Verfasst: 13.09.2006 00:17
von Delle
Genau sowas "Einfaches" meinte ich als Lösung ;) Thanx!

Verfasst: 13.09.2006 00:19
von Kaeru Gaman
> ob die Maus in einem Window bewegt wurde, kann ich ja mittels DesktopMouseX() + DesktopMouseY() abfragen.

sieh dir auch mal WindowMouseX() in der Help an.

DesktopMouseX() liefert absolute koordinaten.
wenn dein fenster bewegt wird, musst du umrechnen.


die lösung von Falko ist etwas "oversized" (sorry, Falko)

die API-Konstanten, die ts angegeben hat, lassen sich zumindest per "normalem" WindowEvent() abfragen.

wenn das API nicht zu störend ist, geht auch folgende möglichkeit:

Code: Alles auswählen

    MLC = GetAsyncKeyState_(#VK_LBUTTON) ; MouseLeftClick
    MRC = GetAsyncKeyState_(#VK_RBUTTON) ; MouseRightClick
vorsicht:
das liefert jeden Mausclick.
du musst dann noch prüfen, ob dein fenster überhaupt den fokus hat,
und ob der zeiger innerhalb des fensters ist.

eine Linux-Variante ist mir nicht bekannt.

Verfasst: 13.09.2006 01:02
von Falko
>>> die lösung von Falko ist etwas "oversized" (sorry, Falko)

Im Grunde genommen haste ja Recht.

Für Windowsfunktionen sind halt nur wenige Funktionen WindowMouseX und WindowMouseY dazu gekommen.
Dabei hätte Fred und Co in PB4 auch WindowMouseKey() und WindowKey() ergänzen können.

Aber über die Events kann man ja, wie ts-soft schon oben geschrieben hatte
alles mittels #WM... erreichen :allright: .

Code: Alles auswählen

OpenWindow(0,10,10,300,300,"")

Repeat
  event = WaitWindowEvent()
  Select event
  Case #WM_LBUTTONDOWN ; Linke Maustaste gedrückt
       Debug EventwParam()
  Case #WM_RBUTTONDOWN ; Rechte Maustaste gedrückt  
       Debug EventwParam()
  Case #WM_MBUTTONDOWN ; Mittlere Maustaste gedrückt
       Debug EventwParam()
  Case #WM_MOUSEWHEEL  ; Scrollrad gedreht
        Debug "Scrollen (+/- für die Richtung):"+Str(EventwParam()>>16)
  Case #WM_MOUSEMOVE ; Maus bewegt
       Debug "MouseX="+Str(EventlParam()&$FFFF)+" : MouseY="+Str(EventlParam()>>16)
  Case #WM_CHAR
        Debug Chr(EventwParam()); Taste ausgeben
  EndSelect 
  
  
Until Event = #WM_CLOSE
Vielleicht kommt die Erleuchtung ja erst ab PB5.



Grüße ...Falko

Verfasst: 13.09.2006 12:25
von PBZecke
Wenn man wie ich Windows-Only programmiert kann man eh das
meiste gleich über API machen, da man früher oder später doch nicht drum
rum kommt 8)

Verfasst: 13.09.2006 12:44
von DarkDragon