Seite 1 von 2

[SOLVED] MouseWheel außerhalb eines Fenster

Verfasst: 17.11.2020 18:05
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

Re: MouseWheel auserhalb eines Fenster

Verfasst: 17.11.2020 20:14
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)

Re: MouseWheel auserhalb eines Fenster

Verfasst: 18.11.2020 09:21
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)

Re: MouseWheel auserhalb eines Fenster

Verfasst: 18.11.2020 11:02
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.

Re: MouseWheel auserhalb eines Fenster

Verfasst: 18.11.2020 11:08
von Nino
HeX0R hat geschrieben:Lass es mal mit dem x64 Compiler laufen.
Anderen Forenmitgliedern ist allerdings davon abzuraten. :mrgreen:

Re: [SOLVED] MouseWheel außerhalb eines Fenster

Verfasst: 18.11.2020 11:24
von HeX0R
Definitiv! :mrgreen:
Am besten mit x64 und OHNE Debugger ausführen, dann bekommt man dicke Backen ;)

Re: [SOLVED] MouseWheel außerhalb eines Fenster

Verfasst: 19.11.2020 12:09
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.

Re: [SOLVED] MouseWheel außerhalb eines Fenster

Verfasst: 19.11.2020 13:44
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.

Re: [SOLVED] MouseWheel außerhalb eines Fenster

Verfasst: 19.11.2020 18:47
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?

Re: [SOLVED] MouseWheel außerhalb eines Fenster

Verfasst: 23.11.2020 10:20
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.