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
$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
; #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
; #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.
; 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")
;===========================================
; Mausradaktivität bei Windows registrieren
;===========================================
GUIRegisterMsg($WM_MOUSEWHEEL, "AHUDFsGUIRegisterMouseWheel_Werte_aktualisieren")
;=====================
; 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
Return SetError(0,0,$MouseWheelName)
EndFunc
;==============================================
; 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
Func GUIRegisterMouseWheel_Shutdown()
_AutoItObject_Shutdown()
GUIDelete($AHUDFsGUIRegisterMouseWheel_MouseWheel)
EndFunc
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
;==============
; 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
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
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
Func Zuletzt_gerollt($oSelf)
If $oSelf.Direction = "" Then Return False
Return String(Int(TimerDiff($oSelf.Zeitmarke))/1000) & " Sec"
EndFunc
#EndRegion
[/autoit]
und ein kleines Beispielskript, zur Veranschaulichung:
Spoiler anzeigen
#include <GUIRegisterMouseWheel.au3>
[/autoit] [autoit][/autoit] [autoit];====================
; Beispielskript
;====================
GUICreate("Fenster 1",Default,Default,100)
Local $oFenster1_Maus = GUIRegisterMouseWheel()
GUISetState()
GUICreate("Fenster 2",Default,Default,530)
Local $oFenster2_Maus = GUIRegisterMouseWheel()
GUISetState()
GUICreate("Fenster 3",Default,Default,960)
Local $oFenster3_Maus = GUIRegisterMouseWheel()
GUISetState()
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
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.