MouseHotKey - Beispiel

    • Offizieller Beitrag

    Hi,
    üblicherweise sind Hotkeys auf die Tastatur beschränkt. Ich hab mal eine Möglichkeit geschaffen auch die Maustasten zu verwenden. Ist sicher noch nicht der Goldstandard, aber erfüllt schonmal seinen Zweck ;)
    Es können verwendet werden:
    Maus ('left', 'right', 'middle') + ('0-9' und 'A-Z')
    Weiterhin könnt ihr die Zeitdauer festlegen, in der die Taste gedrückt werden muß, Standard ist 1000 ms.
    Syntax:
    Erstellen: HotKeyMouseSet('Maustaste', 'Keyboardtaste', 'Func', 'Responsezeit')
    Aufheben: HotKeyMouseSet()
    Es ist nur ein HKM möglich, da zur Ausführung AdlibEnable verwendet wird. Heißt also auch, dass ihr im Skript auf Adlibenable verzichten müßt. (oder es entsprechend erweitert)

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <Misc.au3>
    Opt("GUIOnEventMode", 1)

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

    HotKeySet("{ESC}", "closeGUI")
    Global $isMHK = 0
    Global $m_checkParam[4], $user_dll = DllOpen("user32.dll")

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

    $gui = GUICreate('Test Mouse-Hotkey')
    GUISetOnEvent($GUI_EVENT_CLOSE, 'closeGUI')
    GUICtrlCreateLabel('Beenden mit <ESC> oder |X|', 50, 20, 150)
    GUICtrlCreateLabel('Mouse:', 10, 78, 50)
    $coMouse = GUICtrlCreateCombo('left', 70, 75, 50)
    GUICtrlSetData(-1, 'right|middle', 'left')
    GUICtrlCreateLabel('+ Key:', 150, 78, 50)
    $coKey = GUICtrlCreateCombo('0', 190, 75, 40)
    $sItem = ''
    For $i = 49 To 90
    If $i = 58 Then $i = 65
    $sItem &= Chr($i) & '|'
    Next
    GUICtrlSetData($coKey, StringTrimRight($sItem, 1), '0')
    $btSetMHK = GUICtrlCreateButton('Mouse-Hotkey setzen', 40, 120, 180, 20)
    GUICtrlSetOnEvent(-1, 'setMHK')
    GUISetState()

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

    While 1
    Sleep(20)
    WEnd

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

    Func closeGUI()
    If $isMHK Then HotKeyMouseSet()
    DllClose($user_dll)
    Exit
    EndFunc ;==>closeGUI

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

    Func setMHK()
    If $isMHK Then
    HotKeyMouseSet()
    GUICtrlSetData($btSetMHK, 'Mouse-HotKey setzen')
    WinSetTitle($gui, '', 'Hotkey ist jetzt deaktiviert')
    Else
    HotKeyMouseSet(GUICtrlRead($coMouse), GUICtrlRead($coKey), 'test')
    GUICtrlSetData($btSetMHK, 'Mouse-HotKey löschen')
    WinSetTitle($gui, '', 'aktueller MHK: ' & StringUpper(GUICtrlRead($coMouse)) & ' + ' & GUICtrlRead($coKey))
    EndIf
    $isMHK = BitXOR($isMHK, 1)
    EndFunc ;==>setMHK

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

    Func HotKeyMouseSet($m_button = '', $key = '', $func = '', $r_time = 1000)
    If Not $m_button Then Return AdlibDisable()
    If Not $key Or Not $func Then Return SetError(1, 0, 0)
    If Not IsString($func) Then Return SetError(2, 0, 0)
    $key = Asc(StringUpper($key))
    If $m_button = 'left' Then
    $m_checkParam[0] = '01'
    ElseIf $m_button = 'right' Then
    $m_checkParam[0] = '02'
    ElseIf $m_button = 'middle' Then
    $m_checkParam[0] = '04'
    Else
    Return SetError(3, 0, 0)
    EndIf
    $m_checkParam[1] = $key
    $m_checkParam[2] = $func
    $m_checkParam[3] = $r_time
    Local $ret
    Do ; Tastaturpuffer leeren
    For $i = 1 To 256
    $ret = DllCall($user_dll, "int", "GetAsyncKeyState", "int", "0x" & Hex($i, 2))
    Next
    Until $ret[0] = 0
    AdlibEnable('_checkMouse', 100)
    EndFunc ;==>HotKeyMouseSet

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

    Func _checkMouse()
    Local $ts, $ret
    If _IsPressed($m_checkParam[0], $user_dll) Then
    $ts = TimerInit()
    Do
    $ret = DllCall($user_dll, "int", "GetAsyncKeyState", "int", "0x" & Hex($m_checkParam[1], 2))
    If $ret[0] Then Return Call($m_checkParam[2])
    Until TimerDiff($ts) > $m_checkParam[3]
    EndIf
    EndFunc ;==>_checkMouse

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

    Func test()
    MsgBox(0, 'MausHotKey', 'Hotkey wurde ausgeführt')
    EndFunc ;==>test

    [/autoit]
    • Offizieller Beitrag

    der leert den puffer? wofür das?


    Eigentlich nur beim ersten Aufruf (evtl.) nötig. Habe es sicherheitshalber reingesetzt, sonst kann es mal passieren, dass der Pufferinhalt den Key ausgibt, ohne dass es gewollt ist. Ist zwar etwas hypothetisch, aber sicher ist sicher.