[SOLVED] MouseWheel außerhalb eines Fenster

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Syr2
Beiträge: 31
Registriert: 11.03.2020 13:39

[SOLVED] MouseWheel außerhalb eines Fenster

Beitrag von Syr2 »

Moinmoin,
Frage:
Kann man irgendwie den Mousewheeldelta abfragen, während das Program keinen Focus hat?

Ich hab jetzt mal mit Mousehooks experimentiert, und genauso wie bei callbacks etc. bekommt man von der WinAPI ja die eventswparam(), da steht #wm_Mousewheel drinnen. Also ob oder ob kein mousewheel event anliegt. Eigentlich sollte dann ja im nächsten wparams das Mausdelte drin stehen.

Hier mal was ich meine:

Code: Alles auswählen

hwnd = OpenWindow(#PB_Any,0,0,100,100,"")
SetFocus_(hwnd)

Repeat
  event = WaitWindowEvent(1)
  If event = #WM_MOUSEWHEEL
    Debug EventwParam()
  EndIf
ForEver
Solange mein Cusor auf das Fenster zeigt kann ich scrollen. Wie mache ich das, wenn der Cursor außerhalb ist?

Zweiter Codeschnipsel geht genauso wenig:

Code: Alles auswählen

Structure MSLLHOOKSTRUCT
    pt.POINT;
    mouseData.l;
    flags.l;
    time.l;
    dwExtraInfo.l;
EndStructure

Procedure.l MouseProc(ncode.l,wParam.l,lParam.l)
   
    Static lbStarttime.i,lbEndtime.i
    Static rbStarttime.i,rbEndtime.i
    Static sx,ex,sy,ey
    Protected px,py
    Static mMouseInput.MSLLHOOKSTRUCT
    CopyMemory(lparam,@mMouseInput,SizeOf(MSLLHOOKSTRUCT)) 
    Static mInput.MOUSEINPUT
    lastevent = event
    
    If ncode = #HC_ACTION
      If wParam
        Select wParam
          Case #WM_MOUSEWHEEL
            Debug "DELTA?"
        EndSelect
      EndIf
    EndIf
    
   ProcedureReturn CallNextHookEx_(myMousehook, nCode, wParam, lParam)

EndProcedure

Procedure SetMouseHook()
    hInstance = GetModuleHandle_(0)
     
    If hInstance
       myMouseHook = SetWindowsHookEx_(#WH_MOUSE_LL, @MouseProc(),hInstance,0)
    Else
       MessageRequester("hook", "can't get module handle")
    EndIf 

EndProcedure
SetMouseHook()
Repeat
  Delay(1)
ForEver
Zuletzt geändert von Syr2 am 18.11.2020 09:30, insgesamt 3-mal geändert.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: MouseWheel auserhalb eines Fenster

Beitrag von HeX0R »

Wahnsinn... was ein übles Beispiel

Code: Alles auswählen

Repeat
  Delay(1)
ForEver
ernsthaft??

Code: Alles auswählen

Global myMouseHook

Structure MSLLHOOKSTRUCT
    pt.POINT
    mouseData.l
    flags.l
    time.l
    *dwExtraInfo
EndStructure

Procedure MouseProc(ncode, wParam, lParam)
    Protected *mMouseInput.MSLLHOOKSTRUCT, MWheel.w
   
    If ncode = #HC_ACTION
    	If wParam = #WM_MOUSEWHEEL
    		*mMouseInput = lParam
    		MWheel = *mMouseInput\mouseData >> 16
    		If MWheel > 0
    			Debug Str(MWheel) + " (Wheel Up)"
    		ElseIf MWheel < 0
    			Debug Str(MWheel) + " (Wheel Down)"
    		EndIf
      EndIf
    EndIf
   
   ProcedureReturn CallNextHookEx_(myMousehook, nCode, wParam, lParam)

EndProcedure

Procedure SetMouseHook()
    hInstance = GetModuleHandle_(0)
     
    If hInstance
       myMouseHook = SetWindowsHookEx_(#WH_MOUSE_LL, @MouseProc(), hInstance, 0)
    Else
       MessageRequester("hook", "can't get module handle")
    EndIf

EndProcedure
SetMouseHook()

OpenWindow(0, 0, 0, 300, 300, "Test")
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

UnhookWindowsHookEx_(myMouseHook)
Syr2
Beiträge: 31
Registriert: 11.03.2020 13:39

Re: MouseWheel auserhalb eines Fenster

Beitrag von Syr2 »

BAAM! Sehr geil, dein Code funktioniert, genau was ich gesucht habe! Danke!
PS:
Was spricht denn gegen den Beispielcode? Der Hook ist gesetzt, also kann ich doch sinnlos loopen und damit das program offen halten. (Der Hook geht ja trotzdem)
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: MouseWheel auserhalb eines Fenster

Beitrag von HeX0R »

Syr2 hat geschrieben:PS:
Was spricht denn gegen den Beispielcode? Der Hook ist gesetzt, also kann ich doch sinnlos loopen und damit das program offen halten. (Der Hook geht ja trotzdem)
Lass es mal mit dem x64 Compiler laufen.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: MouseWheel auserhalb eines Fenster

Beitrag von Nino »

HeX0R hat geschrieben:Lass es mal mit dem x64 Compiler laufen.
Anderen Forenmitgliedern ist allerdings davon abzuraten. :mrgreen:
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: [SOLVED] MouseWheel außerhalb eines Fenster

Beitrag von HeX0R »

Definitiv! :mrgreen:
Am besten mit x64 und OHNE Debugger ausführen, dann bekommt man dicke Backen ;)
Syr2
Beiträge: 31
Registriert: 11.03.2020 13:39

Re: [SOLVED] MouseWheel außerhalb eines Fenster

Beitrag von Syr2 »

HeX0R hat geschrieben:Definitiv! :mrgreen:
Am besten mit x64 und OHNE Debugger ausführen, dann bekommt man dicke Backen ;)
keine Ahnung was ihr meint... Habs mal auf x64 ohne Debugger gestartet (Also einfach nur die Loop). Ist erwartungsgemäß genau gar nichts passiert.
Also so wie ich das auch erwartet hätte. Er macht eine ms lang ein sleep_() und dann loopt er. Kostet die CPU ja mal gar keine Rechenleistung. Lassts mal Laufen und gebt mir Recht :P

PS: Bitte nicht unter DOS laufen lassen, da wird während dem sleep kein anderer Prozess drankommen.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: [SOLVED] MouseWheel außerhalb eines Fenster

Beitrag von Nino »

Syr2 hat geschrieben:PS: Bitte nicht unter DOS laufen lassen, da wird während dem sleep kein anderer Prozess drankommen.
Redest du über PureBasic :?:

PureBasic-Programme laufen nicht unter DOS.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: [SOLVED] MouseWheel außerhalb eines Fenster

Beitrag von ccode_new »

Hallo!
An Syr2:

Welche Windowsversion verwendest du?

Die Windows-Konsole hat schon lange nichts mehr mit der (DOS)-Eingabeaufforderung zu tun.

Und dein Loooooooooooooooooooooooooo...∞p
Repeat
Delay(1)
ForEver
ist echt uncool.

Kannst du bei dem Beispiel den Mauszeiger noch vernünftig bewegen?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Syr2
Beiträge: 31
Registriert: 11.03.2020 13:39

Re: [SOLVED] MouseWheel außerhalb eines Fenster

Beitrag von Syr2 »

ccode_new hat geschrieben:Hallo!
An Syr2:

Welche Windowsversion verwendest du?

Die Windows-Konsole hat schon lange nichts mehr mit der (DOS)-Eingabeaufforderung zu tun.

Und dein Loooooooooooooooooooooooooo...∞p
Repeat
Delay(1)
ForEver
ist echt uncool.
Kannst du bei dem Beispiel den Mauszeiger noch vernünftig bewegen?
Wundert mich das da scheinbar einige Leute Probleme haben... Ich schreibe schon seit Jahren mit derartigen Loops und hatte nie irgendwelche Probleme. (Die Leute die meine Programme nutzen ebenfalls nicht). Ich würde ja sagen dann Mehrkernprozessoren ist das kein Problem. Aber eigentlich ist es erstmal dank dem Delay kein Problem. Kann das Programm problemlos 100000x parallel laufen lassen ohne das auch nur irgendwas laggt oder die CPU minimal warm wird.

Zugegebenermaßen ist es etwas behindert dass ich keine Abbruchbedingung eingebaut habe. Will mir mal einer das Ding einfach starten und irgendwie aufzeichnen was da bitte schön das Problem sein soll?

Zum Thema Windowsversion: habe und entwickle auch aktiv unter win 7 und win 10, früher war aber auch win xp und vista nicht das Problem. Sowohl 32 als auch 64 bit btw. und Ubuntu gelgentlich.
Antworten