AutoHotKey-Funktionalität in AutoIt3

  • Hallo zusammen,

    ich wollte mit AutoIt3 ein einfaches Remapping machen: Linke Maustaste gedrückt->Rechte Maustaste senden. Leider habe ich bei AutoIt mit allen möglichen Versuchen keinen Erfolg gehabt; mit AutoHotKey ein Einzeiler. Nach langer erfolgloser Suche wollte ich nur kurz die Profis fragen:

    • Sind AutoHotKey-Funktionalitäten wie z.B. das Remapping von Tastatur- od. Maustasten in AutoIt vorhanden?
    • Kann ich ein mit AutoHotKey erstelltes *.ahk-Skript (auch über Umwege) in *.au3 konvertieren? In *.exe ist's ja kein Prob.

    Danke für eure Antwort!

    Einmal editiert, zuletzt von FirefighterJo (9. Juli 2008 um 09:01)

    • Offizieller Beitrag

    Nein, die Funktionen gibt es nicht. AutoIt und AutoHotKey entwickeln sich unterschiedlich. AutoIt ist mehr zur vollwertigen, professionellen Programmiersprache (v.a. Syntax!), AutoHotKey eher spielerisch, mit vor allem starken Remapping- und Hotkey-Funktionen, wie du ja bemerkst.

    Nein, Konvertieren geht nicht allgemein. Der AutoIt 2.64 -> 3 Konverter existiert zwar, bringt aber nichts, gerade nicht bei Funktionen, die AutoIt in Version 3 noch nicht hatte, weil es sie bis heute nicht hat.

    Von daher schlechte Aussichten.

    Aber dein konkreter Fall mag mit _IsPressed umsetzbar sein :).

    peethebee

  • Hi peethebee,

    danke für die schnelle Antwort. In meinem Fall ging es genau gesagt um das Remapping

    • LinkerMausklick->SendeRechterMausklick
    • RechterMausklick->SendeLinkerMausklick

    also im Prinzip ein Tastenswap wie bei Linkshändermaus.

    [autoit]

    Local $user32 = DllOpen("user32")
    HotKeySet( "^{F9}", "Terminate")
    #NoTrayIcon

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

    ;--------------Funktionsdeklarationen:------------------------------------

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

    ;Welche Taste ist gedrückt?
    Func _IsPressed($hexKey)
    Local $aR, $bRv
    $hexKey = '0x' & $hexKey
    $aR = DllCall($user32, "int", "GetAsyncKeyState", "int", $hexKey)
    If $aR[0] <> 0 Then
    $bRv = 1
    Else
    $bRv = 0
    EndIf
    Return $bRv
    EndFunc

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

    ;STRG und F9 beendet das Spiel
    Func Terminate()
    DllClose($user32)
    Exit
    EndFunc

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

    While 1
    If _IsPressed('01') = 1 Then
    MouseClick("right")
    Sleep(100)
    While _IsPressed('01') = 1 Or _IsPressed('02') = 1
    MouseUp("right")
    MouseUp("left")
    WEnd
    ElseIf _IsPressed('02') = 1 Then
    MouseClick("left")
    Sleep(100)
    While _IsPressed('01') = 1 Or _IsPressed('02') = 1
    MouseUp("right")
    MouseUp("left")
    WEnd
    EndIf
    WEnd

    [/autoit]


    Der Versuch über _IsPressed scheiterte, weil ich ein "Durchkommen" der ursprünglichen Mausklicks nicht verhindern kann. D.h. er lässt z.B. den gedrückten linken Mausklick durchkommen und sendet noch einen rechten Mausklick. Auch mit dem Aufhängen der Tasten hatte ich Probleme; mit den eingebauten While-Schleifen funktionierts soweit.

    Kannst du mir da weiterhelfen? Du hast sicher noch ne bessere Idee. Vielen Dank im Voraus!

  • Moin,
    also den Aufruf in VB hab ich gefunden (Link)

    Spoiler anzeigen

    Private Declare Function SwapMouseButton Lib "user32.dll" ( _
    ByVal bSwap As Long _
    ) As Long

    0& = nicht vertauscht
    1& = vertauscht

    Klappt leider bei mir nicht, ich komme einfach nicht mit diesem blöden DLLCall klar :( vielleicht hilft es trotzdem, außerdem sind noch ein paar andere nette Sachen auf der Seite.

    EDIT:
    Da fällt mir auf, das hier ist mein 300. Beitrag hier im Forum :rock::D;(:D:rock:

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

    Einmal editiert, zuletzt von McPoldy (9. Juli 2008 um 07:21)

  • Genial. Danke, McPoldy!

    Die user32-API-Funktion ist im msdn zwar als

    Code
    BOOL SwapMouseButton(      
        BOOL fSwap
    );


    definiert; allerdings habe ich den Datentyp "BOOL" bei AutoIt nicht gefunden. Gibt's den garnicht?

    Naja - so funktionierts super: (und wenn ich dran denk, wieviele sich mit Registry-Keys wie "HKEY_CURRENT_USER\Control Panel\Mouse" o.ä. rumschlagen nur um zu merken, dass bei Laufzeit keine Änderung stattfindet sondern der PC neu gestartet werden muss kommen mir die Tränen :P )

    [autoit]

    Opt("OnExitFunc", "Terminate")
    HotKeySet( "^{F9}", "Terminate")

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

    Local $user32 = DllOpen("user32")

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

    DllCall($user32,"int","SwapMouseButton","int","1")

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

    While 1
    Sleep(100)
    WEnd

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

    Func Terminate()
    DllCall($user32,"int","SwapMouseButton","int","0")
    DllClose($user32)
    Exit
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    :thumbup: schöne Sache.
    Am Besten, gleich mal in eine Funktion packen :D

    [autoit]

    ;=====================================================
    ; $Swap 0 = normale Maus, 1 = Maustasten getauscht
    ;=====================================================
    Func _MouseSwap($Swap=0)
    If $Swap <> 0 Then $Swap = 1
    Local $dll = DllOpen("user32")
    DllCall($dll,"int","SwapMouseButton","int",$Swap)
    DllClose($dll)
    EndFunc

    [/autoit]