Makro Monkey

  • Huhu,

    hier ein kleines Skript, das dazu dient, eigene Makros zu erstellen.

    Spoiler anzeigen
    [autoit]


    #include <Misc.au3>
    #include <WinAPI.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>

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

    Opt("TrayMenuMode",1)

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

    Global $aGui[5]
    Global $pfad = @ScriptDir & '\ReadMe.txt'
    Global $dll = DllOpen("user32.dll")
    Global $title_m = "MM"
    Global $time = TimerInit()

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

    $gui = GUICreate($title_m, 188, 100, @DesktopWidth-190, @DesktopHeight-190, BitOR($WS_POPUP, $WS_SYSMENU, $WS_MINIMIZEBOX, $WS_BORDER))
    $aGui[4] = GUICtrlCreateLabel("", 8, 80, 150, 17)
    GUICtrlSetFont (-1, 12)
    $Tab1 = GUICtrlCreateTab(1, 0, 183, 81)
    GUICtrlSetResizing(-1, $GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $Hotkey = GUICtrlCreateTabItem("Hotkey")
    $aGui[0] = GUICtrlCreateInput("N8", 8, 40, 73, 21)
    $Input = GUICtrlCreateTabItem("Input")
    $aGui[1] = GUICtrlCreateInput("ENTER|/resign|ENTER", 8, 40, 169, 21)
    $Help = GUICtrlCreateTabItem("Help")
    GUICtrlSetState(-1,$GUI_SHOW)
    $aGui[2] = GUICtrlCreateLabel("Makro Monkey Vers 0.2 alpha", 35, 60)
    GUICtrlSetFont (-1, 8)
    $aGui[3] = GUICtrlCreateLabel("ReadMe", 8, 32)
    GUICtrlCreateTabItem("")
    $menue = TrayCreateItem("Settings")
    $hotkey = TrayCreateItem("N8")
    TrayCreateItem("")
    $exit = TrayCreateItem("Exit")
    GUISetState(@SW_HIDE)

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

    While 1
    $msg = TrayGetMsg()
    $msg_g =GUIGetMsg()
    Select
    Case $msg = $menue
    If TrayItemGetState($menue) <> 68 Then
    GUISetState(@SW_SHOW)
    Else
    GUISetState(@SW_HIDE)
    EndIf
    Case $msg = $hotkey
    TrayItemSetState($hotkey, 4)
    Case $msg = $exit
    DllClose($dll)
    Exit
    EndSelect
    Select
    Case $msg_g = $aGui[3]
    ShellExecute($pfad)
    Case $msg_g = $GUI_EVENT_CLOSE
    GUISetState(@SW_HIDE)
    TrayItemSetState($menue, 4)
    EndSelect

    If _IsPressed(_hotkeycheck(String(GUICtrlRead($aGui[0]))), $dll) Then
    NoSpam(100)
    If GUICtrlRead($Tab1, 0) <> 0 Then
    If StringInStr(GUICtrlRead($aGui[1]), '|') Then
    $swap = StringSplit(GUICtrlRead($aGui[1]), '|', 2)
    Sleep(Random(25, 100, 1))
    For $i = 0 To (UBound($swap)-1)
    If StringInStr($swap[$i], 'ENTER', 1) Or StringInStr($swap[$i], 'SPACE', 1) Or StringInStr($swap[$i], 'UP', 1) Or StringInStr($swap[$i], 'DOWN', 1) Or StringInStr($swap[$i], 'LIFT', 1) Or StringInStr($swap[$i], 'RIGHT', 1) Or StringInStr($swap[$i], 'ESCAPE', 1) Or StringInStr($swap[$i], 'SHIFT', 1) Or StringInStr($swap[$i], 'CAPSLOCK ON', 1) Or StringInStr($swap[$i], 'CAPSLOCK OFF', 1) Or StringInStr($swap[$i], 'SLEEP', 1) Then
    If IsNumber(_commands($swap[$i])) Then
    Sleep(_commands($swap[$i])*1000)
    Else
    Send(_commands($swap[$i]))
    EndIf
    Else
    Send($swap[$i])
    EndIf
    Next
    Else
    Sleep(Random(25, 100, 1))
    Send(GUICtrlRead($aGui[1]))
    EndIf
    EndIf
    Sleep(Random(25, 100, 1))
    ElseIf _IsPressed('1B') Then
    Exit
    EndIf
    WEnd

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

    Func _hotkeycheck($key)
    Dim $key, $keys='30,0|31,1|32,2|33,3|34,4|35,5|36,6|37,7|38,8|39,9|41,A|42,B|43,C|44,D|45,E|46,F|47,G|48,H|49,I|4A,J|4B,K|4C,L|4D,M|4E,N|4F,O|50,P|51,Q|52,R|53,S|54,T|55,U|56,V|57,W|58,X|59,Y|5A,Z|60,N0|61,N1|62,N2|63,N3|64,N4|65,N5|66,N6|67,N7|68,N8|69,N9|02,MausR|01,MausL'
    $keyL = StringSplit($keys, '|', 2)
    For $j = 0 To (UBound($keyL)-1)
    $buff = StringSplit($keyL[$j], ',', 2)
    If $buff[1] = $key Then
    Return $buff[0]
    ExitLoop
    EndIf
    If Not StringInStr($keys, $key, 0) Then
    TrayTip("Error","Not a valid Hotkey",4 , 3)
    Else
    title_()
    EndIf
    Next
    EndFunc

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

    Func _commands($string)
    Dim $string
    If 'ENTER' = $string Then
    Return '{ENTER}'
    EndIf
    If 'SPACE' = $string Then
    Return '{SPACE}'
    EndIf
    If 'UP' = $string Then
    Return '{UP}'
    EndIf
    If 'DOWN' = $string Then
    Return '{DOWN}'
    EndIf
    If 'LEFT' = $string Then
    Return '{LEFT}'
    EndIf
    If 'RIGHT' = $string Then
    Return '{RIGHT}'
    EndIf
    If 'ESCAPE' = $string Then
    Return '{ESCAPE}'
    EndIf
    If 'SHIFT' = $string Then
    Return '{LSHIFT}'
    EndIf
    If 'CAPSLOCK ON' = $string Then
    Return '{CAPSLOCK ON}'
    EndIf
    If 'CAPSLOCK OFF' = $string Then
    Return '{CAPSLOCK OFF}'
    EndIf
    If StringInStr($string, 'SLEEP', 1) Then
    $buff_ = StringSplit($string, ':', 2)
    Return Number($buff_[1])
    EndIf
    EndFunc

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

    Func NoSpam($delay)
    Local $key = False
    Do
    Sleep($delay)
    If Not _IsPressed(_hotkeycheck(String(GUICtrlRead($aGui[0]))), $dll) Then
    $key = True
    Else
    $key = False
    EndIf
    Until $key = True
    EndFunc

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

    Func title_()
    If TimerDiff($time) > 500 Then
    GUICtrlSetData($aGui[4], "MM" & "-" & GUICtrlRead($aGui[0]))
    TrayItemSetText($hotkey, "Hotkey " & GUICtrlRead($aGui[0]))
    $time = TimerInit()
    EndIf
    EndFunc

    [/autoit]

    ReadMe

    Spoiler anzeigen


    A 'lil macro Tool

    Supported Hotkeys:
    A to Z
    0 to 9
    0 to 9 Numpad ( enter N0 to N9 to use it)

    Sign to split commands and text: '|'
    Use capital letters for commands.
    included commands:
    ENTER
    SPACE
    UP
    DOWN
    LEFT
    RIGHT
    ESCAPE
    SHIFT
    CAPSLOCK ON
    CAPSLOCK OFF
    SLEEP:x replace x with a number

    Example for input:
    ENTER|/resign|ENTER
    SLEEP:10|Hello

    Mögliche Erweiterungen:
    kontrolle über Programme
    Mauskontrolle
    grafische Oberfläche interessanter gestalten
    for-Schleifen

    mfG bocky

    • Offizieller Beitrag

    Ich kann nur wiederholen, was ich schon zu deinen Fragen vorab in der Shoutbox gesagt habe: HotKeySet() erledigt das für dich.
    Du meintest zwar, dass dies nicht die Funktion wär, die du suchst. Aber dann hast du sie wohl noch nicht verstanden.
    Dein Skript ist ein sehr aufwändiger Nachbau der Funktion HotKeySet() und da es nicht so simpel, wie diese Funktion zu nutzen ist, sehe ich da auch keinen Mehrwert.
    Aber laß dich nicht entmutigen. Es gibt sicher noch Einiges, dass nicht bereits in Funktionen gegossen ist. ;)

  • HotKeySet hat die Eigenschaft, dass es die Tastaturaktion abfängt, was ich nicht unbedingt als förderlich erachte, auch wenn man diese wieder durch das Skript senden lassen kann.
    Von den Zuweisungsbeschränkungen einmal abgesehen.

    Mit der Frage in der Shoutbox wollte ich wissen, ob solch ein Skript bereits als Bot zählt.
    Mit der Kontrolle der Maus und Implementation der For-Schleife wäre das nach meiner Meinung der Fall.

    Hier als UDF.
    Der Mehrwert besteht im Vergleich zu HotKeySet, in der Zuweisungsmöglichkeit aller von _isPressed() unterstützten Tasten sowie Funktionsaufrüfe mit Parametern, wobei sie ebenso simpel aufzurufen ist wie HotKeySet, wenn du so willst.

    Spoiler anzeigen
    [autoit]


    Func My_HotKeySet($key, $function)
    Dim $key, $keys='30,0|31,1|32,2|33,3|34,4|35,5|36,6|37,7|38,8|39,9|41,A|42,B|43,C|44,D|45,E|46,F|47,G|48,H|49,I|4A,J|4B,K|4C,L|4D,M|4E,N|4F,O|50,P|51,Q|52,R|53,S|54,T|55,U|56,V|57,W|58,X|59,Y|5A,Z|60,N0|61,N1|62,N2|63,N3|64,N4|65,N5|66,N6|67,N7|68,N8|69,N9|02,MausR|01,MausL'
    If IsString($key) Then
    $keyL = StringSplit($keys, '|', 2)
    For $j = 0 To (UBound($keyL)-1)
    $buff = StringSplit($keyL[$j], ',', 2)
    If $buff[1] = $key Then
    ExitLoop
    EndIf
    Next
    If _IsPressed($buff[0]) Then
    If IsString($function)Then
    Execute($function)
    Else
    SetError(1)
    EndIf
    Return True
    Else
    Return False
    EndIf
    Else
    SetError(-1)
    EndIf
    EndFunc

    [/autoit]
    Spoiler anzeigen
    [autoit]


    My_HotKeySet("9", "MsgBox(0, 'Test', 'Test')")

    [/autoit]