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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

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

Beitrag 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...
PB 6.21 | Win 11
Benutzeravatar
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

Beitrag von ts-soft »

Unter Windows mit:
#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.
Bild
Benutzeravatar
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:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag von Delle »

Ohne API gehen solche einfachen Abfragen also nicht mit PB4? :-/
PB 6.21 | Win 11
Benutzeravatar
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

Beitrag 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
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.
Bild
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag von Delle »

Genau sowas "Einfaches" meinte ich als Lösung ;) Thanx!
PB 6.21 | Win 11
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
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:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
PBZecke
Beiträge: 399
Registriert: 02.09.2004 17:34

Beitrag 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)
Nein, ich habe die Suche nicht benutzt, und deshalb auch nichts dazu gefunden... :lol:
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten