GUIRegisterMouseWheel() - einfache Abfrage des Mausrades (für bis zu 255 GUIs getrennt oder als Summe)

  • Hallo Leute,

    ich will heute mal auf ein Thema eingehen, daß im Forum zwar schon gelöst wurde, für das es aber bisher keinen komfortabelen Befehl gibt. Die Rede ist von der Abfrage des Mausrades. Vielleicht ein Hinweis zu Beginn: das Mausrad kann bei MS Windows nicht direkt abgefragt werden, sondern die Abfrage ist immer an ein konkretes Fenster gebunden. Wie funktioniert der Befehl GUIRegisterMouseWheel() nun:

    Anleitung:

    1. Erstelle ein oder mehrere GUIs

    [autoit]

    $GUI1=GUICreate("")

    [/autoit]

    2. Jetzt das erstellte GUI zur automatischen Mausradabfrage registrieren

    [autoit]

    Local $GUI1_Mausrad = GUIRegisterMouseWheel($GUI1)

    [/autoit]


    ... dabei entsteht ein Objekt, in diesem Beispiel mit dem frei gewählten Namen $GUI1_Mausrad.
    Am Ende nicht vergessen, das GUI sichtbar zu machen mit GUISetState(@SW_Show) .

    Fertig ! ;)

    Ab nun kannst du jederzeit mit:

    $GUI1_Mausrad.Position abfragen, wie weit das Mausrad bezogen auf dieses GUI schon vor oder zurück gerollt ist (Startpunkt ist 0)
    $GUI1_Mausrad.Direction die letzte Rollrichtung abfragen (bezogen auf dieses GUI): "UP" oder "DOWN"
    $GUI1_Mausrad.Time() abfragen, wie lange die letzte Mausradaktion schon her ist in Milisek. (bezogen auf dieses GUI)
    $GUI1_Mausrad.Last bei mehreren GUIs, die zur Mausradabfrage angemeldet wurden, ob die letzte Mausradaktion sich auf dieses GUI bezieht (True / False)

    Daneben kannst Du auch die Summe aller Mausradaktionen bezogen auf alle registrierten GUIs mit dem vorgegebenen Objekt-Variabelname $oMouseWheel abfragen:

    $oMouseWheel.Position
    $oMouseWheel.Direction
    $oMouseWheel.Time()
    $oMouseWheel.Last (ist nur vor der ersten Mausradaktion False, danach immer True)


    Und hier nun meine kleine UDF:

    Spoiler anzeigen
    [autoit]

    ; #INDEX# =======================================================================================================================
    ; Titel .........: GUIRegisterMouseWheel
    ; AutoIt Version : 3.3
    ; Language ......: German
    ; Beschreibung ..: Abfrage der Mausrad-Aktivität für bis zu 255 Fenster getrennt und als Gesamtsumme (z.T. objektorientiert)
    ; Autor .........: Deep Thought (http://www.autoit.de)
    ; Version .......: 0.2
    ; ===============================================================================================================================
    #include-once
    #include <AutoItObject.au3>
    #include <WindowsConstants.au3>
    Global $AHUDFsGUIRegisterMouseWheel_Index[257][2] = [[0]] ;interne Variabel

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: GUIRegisterMouseWheel
    ; Beschreibung ..: Meldet ein Fenster zur Mausradabfrage an. Danach kann jedezeit der aktuelle Mausrad-Status des jeweiligen
    ; Fensters über ein Objekt abgefragt werden.

    [/autoit] [autoit][/autoit] [autoit]

    ; Syntax ........: $oObject = GUIRegisterMouseWheel([$Handle])
    ; Parameter .....: $Handle - das Handle des Fensters, auf das die Mausrad-Abfrage reagieren soll, oder wenn nicht angegeben,
    ; dann das zuletzt benutzte Fenster.
    ; Rückgabewert ..: $oObject - Zeiger auf das entstandene Objekt. Der Objektname ($oObject) kann frei gewählt werden.
    ; Errorcode .....: 1 - es wurde versucht mehr als 255 Fenster anzumelden
    ;
    ; Objectproperty : $oObject.Position - Zähler, wie weit das Mausrad schon vor- oder zurückgerollt ist
    ; $oObject.Direction - letzte Drehrichtung: "UP" oder "DOWN"
    ; $oObject.Time() - Zeitdifferenz zur letzten Mausradaktion
    ; $oObject.Last - "True" wenn Mausrad auf dieses Fenster beim letzten Mal angewand wurde
    ; - "False" wenn das Mausrad mittlerweise auf ein anderes Fenster angewand wurde
    ;
    ; $oMouseWheel.Position - der Objectname $oMouseWheel ist fest vorgegeben und gibt die Summe aller
    ; $oMouseWheel.Direction Mausradaktionnen aller registrierten Fenster wieder
    ; $oMouseWheel.Time()
    ; $oMouseWheel.Last
    ;
    ; Beispiel ......: GUICreate("GUI")
    ; Local $oGUI = GUIRegisterMouseWheel()
    ; GUISetState()
    ;
    ; Do
    ; ToolTip("GUI:"& _
    ; @CRLF&" - Position: " & $oGUI.Position & _
    ; @CRLF&" - Richtung: " & $oGUI.Direction & _
    ; @CRLF&" - Zeit: " & $oGUI.Time() & _
    ; @CRLF&" - Zuletzt: " & $oGUI.Last & @CRLF& _
    ; @CRLF&"MouseWheel (=Gesamt):" & _
    ; @CRLF&" - Position: " & $oMouseWheel.Position & _
    ; @CRLF&" - Richtung: " & $oMouseWheel.Direction & _
    ; @CRLF&" - Zeit: " & $oMouseWheel.Time() & _
    ; @CRLF&" - Zuletzt: " & $oMouseWheel.Last )
    ; Until GuiGetMsg()=-3
    ; ===============================================================================================================================
    Func GUIRegisterMouseWheel($Handle=Default)
    ; Handle bestimmen
    If $Handle=Default Then
    $Handle=GUISwitch(WinActive("[ACTIVE]"))
    GUISwitch($Handle)
    EndIf
    If $AHUDFsGUIRegisterMouseWheel_Index[0][1] Then
    GUIDelete(WinGetHandle("GUIRegisterMouseWheel"))
    $AHUDFsGUIRegisterMouseWheel_Index[0][1] = False
    EndIf
    ;=======================================
    ; Objekt mit Eigenschaften und Methoden
    ;=======================================
    ; Objekt
    Local $MouseWheelName = _AutoItObject_Create()
    ; Eigenschaften
    _AutoItObject_AddProperty($MouseWheelName, "Direction")
    _AutoItObject_AddProperty($MouseWheelName, "Position")
    _AutoItObject_AddProperty($MouseWheelName, "Last")
    _AutoItObject_AddProperty($MouseWheelName, "Zeitmarke")
    $MouseWheelName.Direction = False
    $MouseWheelName.Position = 0
    $MouseWheelName.Last = False
    $MouseWheelName.Zeitmarke = False
    ; Methoden
    _AutoItObject_AddMethod($MouseWheelName, "Hochrollen", "Hochrollen" )
    _AutoItObject_AddMethod($MouseWheelName, "Runterrollen", "Runterrollen" )
    _AutoItObject_AddMethod($MouseWheelName, "Jetzt_rollen", "Jetzt_rollen" )
    _AutoItObject_AddMethod($MouseWheelName, "Time", "Zuletzt_gerollt")

    [/autoit] [autoit][/autoit] [autoit]

    ;===========================================
    ; Mausradaktivität bei Windows registrieren
    ;===========================================
    GUIRegisterMsg($WM_MOUSEWHEEL, "AHUDFsGUIRegisterMouseWheel_Werte_aktualisieren")

    [/autoit] [autoit][/autoit] [autoit]

    ;=====================
    ; Beim Index anmelden
    ;=====================
    If $AHUDFsGUIRegisterMouseWheel_Index[0][0]>256 Then SetError(1)
    $AHUDFsGUIRegisterMouseWheel_Index[0][0] += 1
    $AHUDFsGUIRegisterMouseWheel_Index[$AHUDFsGUIRegisterMouseWheel_Index[0][0]][0] = $Handle
    $AHUDFsGUIRegisterMouseWheel_Index[$AHUDFsGUIRegisterMouseWheel_Index[0][0]][1] = $MouseWheelName

    [/autoit] [autoit][/autoit] [autoit]

    Return SetError(0,0,$MouseWheelName)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;==============================================
    ; interne Unterfunktionen und Methoden
    ;==============================================
    #Region
    ;GUIRegisterMouseWheel_Startup
    _AutoItObject_Startup()
    Global $AHUDFsGUIRegisterMouseWheel_MouseWheel = GUICreate("GUIRegisterMouseWheel",10,10,-32000,-32000,-1, BitOR ($WS_EX_TOOLWINDOW, $WS_EX_WINDOWEDGE))
    GUISetState()
    Local $oMouseWheel = GUIRegisterMouseWheel()
    OnAutoItExitRegister("GUIRegisterMouseWheel_Shutdown")
    ;End GUIRegisterMouseWheel_Startup

    [/autoit] [autoit][/autoit] [autoit]

    Func GUIRegisterMouseWheel_Shutdown()
    _AutoItObject_Shutdown()
    GUIDelete($AHUDFsGUIRegisterMouseWheel_MouseWheel)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func AHUDFsGUIRegisterMouseWheel_Werte_aktualisieren($hWndGUI, $MsgID, $WParam, $LParam)
    ;Welches GUI
    For $n = 1 To $AHUDFsGUIRegisterMouseWheel_Index[0][0]
    If $AHUDFsGUIRegisterMouseWheel_Index[$n][0] = $hWndGUI Then ExitLoop
    Next
    ;Welche Drehrichtung
    If $WParam = 0xFF880000 Then
    $AHUDFsGUIRegisterMouseWheel_Index[$n][1].Runterrollen()
    Else
    $AHUDFsGUIRegisterMouseWheel_Index[$n][1].Hochrollen()
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;==============
    ; Methoden
    ;==============
    Func Hochrollen($oSelf)
    $oSelf.Jetzt_rollen()
    $oSelf.Direction = "UP"
    $oSelf.Position = $oSelf.Position + 1
    $oMouseWheel.Zeitmarke = $oSelf.Zeitmarke
    $oMouseWheel.Last = True
    $oMouseWheel.Direction = "UP"
    $oMouseWheel.Position = $oMouseWheel.Position + 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Runterrollen($oSelf)
    $oSelf.Jetzt_rollen()
    $oSelf.Direction = "DOWN"
    $oSelf.Position = $oSelf.Position - 1
    $oMouseWheel.Zeitmarke = $oSelf.Zeitmarke
    $oMouseWheel.Last = True
    $oMouseWheel.Direction = "DOWN"
    $oMouseWheel.Position = $oMouseWheel.Position - 1
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Jetzt_rollen($oSelf)
    $oSelf.Zeitmarke = TimerInit()
    For $n = 1 To $AHUDFsGUIRegisterMouseWheel_Index[0][0]
    $AHUDFsGUIRegisterMouseWheel_Index[$n][1].Last = False
    Next
    $oSelf.Last = True
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Zuletzt_gerollt($oSelf)
    If $oSelf.Direction = "" Then Return False
    Return String(Int(TimerDiff($oSelf.Zeitmarke))/1000) & " Sec"
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    #EndRegion

    [/autoit]


    und ein kleines Beispielskript, zur Veranschaulichung:

    Spoiler anzeigen
    [autoit]

    #include <GUIRegisterMouseWheel.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ;====================
    ; Beispielskript
    ;====================

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Fenster 1",Default,Default,100)
    Local $oFenster1_Maus = GUIRegisterMouseWheel()
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Fenster 2",Default,Default,530)
    Local $oFenster2_Maus = GUIRegisterMouseWheel()
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Fenster 3",Default,Default,960)
    Local $oFenster3_Maus = GUIRegisterMouseWheel()
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Do
    ToolTip("Fenster1: "& _
    @CRLF&" - Position: "&$oFenster1_Maus.Position& _
    @CRLF&" - Richtung: "&$oFenster1_Maus.Direction& _
    @CRLF&" - Zeit: "&$oFenster1_Maus.Time()& _
    @CRLF&" - Zuletzt: "&$oFenster1_Maus.Last& @CRLF& _
    @CRLF&"Fenster2:"& _
    @CRLF&" - Position: "&$oFenster2_Maus.Position& _
    @CRLF&" - Richtung: "&$oFenster2_Maus.Direction& _
    @CRLF&" - Zeit: "&$oFenster2_Maus.Time()& _
    @CRLF&" - Zuletzt: "&$oFenster2_Maus.Last& @CRLF& _
    @CRLF&"Fenster3:"& _
    @CRLF&" - Position: "&$oFenster3_Maus.Position& _
    @CRLF&" - Richtung: "&$oFenster3_Maus.Direction& _
    @CRLF&" - Zeit: "&$oFenster3_Maus.Time()& _
    @CRLF&" - Zuletzt: "&$oFenster3_Maus.Last& @CRLF& _
    @CRLF&"MouseWheel (=Gesamt):"& _
    @CRLF&" - Position: "&$oMouseWheel.Position& _
    @CRLF&" - Richtung: "&$oMouseWheel.Direction& _
    @CRLF&" - Zeit: "&$oMouseWheel.Time()& _
    @CRLF&" - Zuletzt: "&$oMouseWheel.Last)
    Sleep(30)
    Until guigetmsg()=-3

    [/autoit]

    Wichtig: da diese UDF z.T. objektorientiert umgesetzt wurde, benötigst Du die AutoItObject.au3.


    Viel Spaß beim ausprobieren.

    Über euer Feedback und Anregungen freue ich mich natürlich. :)


    Deep Thought


    UDF und Beispielskript findest Du auch hier als Download.