Linke/rechte Maus Abfrage für Window (nicht Screen!)
Linke/rechte Maus Abfrage für Window (nicht Screen!)
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...
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...
PB 6.21 | Win 11
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Unter Windows mit:
#WM_LBUTTONDOWN
#WM_LBUTTONUP
#WM_RBUTTONDOWN
#WM_RBUTTONUP
#WM_LBUTTONDOWN
#WM_LBUTTONUP
#WM_RBUTTONDOWN
#WM_RBUTTONUP
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- Falko
- Admin
- Beiträge: 3535
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
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
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Nein, sind immer an Gadgets gebunden (EventType())Delle hat geschrieben:Ohne API gehen solche einfachen Abfragen also nicht mit PB4? :-/
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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> 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:
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.
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
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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- Falko
- Admin
- Beiträge: 3535
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
>>> 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
.
Vielleicht kommt die Erleuchtung ja erst ab PB5.
Grüße ...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
Grüße ...Falko
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten: