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

.
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

Verfasst: 13.09.2006 12:44
von DarkDragon