Wie baut man ein Macro

  • Hallo,

    nachdem ich heute mal einem Kollegen Autoit vorgestellt habe, kam dieser gleich mit einer seiner Ideen auf mich zu.

    Er möchte gern ein Macro im Hintergrund laufen, mit welchem er in jeder offenen Anwendung via Tastaturkürzel verschiedene Texte erzeugt

    Ich stelle mir das so vor. Die Autoit EXE wird gestartet und wartet im Hintergrund.

    Wenn er dann z.B.

    "++h" drückt, wird der Text "Hallo" gesendet

    oder

    "++n" drückt, wird der Text "Vorname Nachname" gesendet

    usw.

    Kann ja eventuell sehr lange werden. Also ähnlich dem AutoText in Winword, aber über alle Anwendungen.

    Hat mir da mal jemand ein Grundgerüst ?

    Gruss und Danke

    Hassan

    Einmal editiert, zuletzt von HassanMullah (8. November 2010 um 14:51)

  • Das ist nicht weiter schwer.
    Hier ist mal ein beispiel:

    Spoiler anzeigen
    [autoit]

    HHotKeySet("!n","sendname") ;Alt+n;~ hier können weitere HotKeys hin
    While 1Sleep(20)WEnd
    Func sendname()HotKeySet("deinhotkey")Send("dein Name")HotKeySet("deinhotkey","sendname")EndFunc

    [/autoit]


    Edit: Tut mir leid, mein browser spinnt rum, deswegen ist der code so komisch...

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Vielleicht hilft die die UDF weiter...

    Spoiler anzeigen
    [autoit]

    ; Authors: Manadar, GarryFrost
    ; Contributor: WideBoyDixon

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

    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>

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

    #include-once

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

    Dim $hHook
    Dim $hStub_KeyProc = DllCallbackRegister("_KeyProc", "long", "int;wparam;lparam")
    Dim $hmod = _WinAPI_GetModuleHandle(0)
    Dim $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), $hmod)
    Dim $buffer = ""
    Dim $hotstrings[1]
    Dim $hotfuncs[1]
    Dim $hWnd = GUICreate("")
    GUIRegisterMsg($WM_KEYDOWN, "_GUIKeyProc")

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

    ;; ==========================
    ;; This is your actual script.
    ;; ==========================

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

    ;#include <HotString.au3>

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

    ;~ HotStringSet("CallMe","examplefunction")

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

    ;~ While 1
    ;~ Sleep(10)
    ;~ WEnd

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

    ;~ Func examplefunction()
    ;~ MsgBox(0,"","lolwat!")
    ;~ EndFunc

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

    ;; ==========================
    ;; End of actual script.
    ;; The part above the start of the actual script
    ;; and below this comment
    ;; script can be put in another
    ;; file and included.
    ;; ==========================

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

    Func HotStringSet($hotstring, $func)
    _ArrayAdd($hotstrings, $hotstring)
    _ArrayAdd($hotfuncs, $func)
    EndFunc

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

    Func EvaluateKey($keycode)
    If (($keycode > 64) And ($keycode < 91)) _ ; A - Z
    Or (($keycode > 47) And ($keycode < 58)) Then ; 0 - 9
    $buffer &= Chr($keycode)
    Print($buffer)
    $a = _ArraySearch($hotstrings, $buffer)
    If ( $a >= 0 ) Then
    Call($hotfuncs[$a])
    EndIf
    ElseIf ($keycode > 159) And ($keycode < 164) Then
    Return
    Else
    $buffer = ""
    EndIf
    EndFunc ;==>EvaluateKey

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

    Func _GUIKeyProc($hWnd, $Msg, $wParam, $lParam)
    EvaluateKey(Number($wParam))
    EndFunc

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

    ;===========================================================
    ; callback function. This function must return as quickly as possible or it will stall and block user input
    ;===========================================================
    Func _KeyProc($nCode, $wParam, $lParam)
    Local $tKEYHOOKS
    $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    If $nCode < 0 Then
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndIf
    If $wParam = $WM_KEYDOWN Then
    $vkKey = DllStructGetData($tKEYHOOKS, "vkCode")
    _WinAPI_PostMessage($hWnd, $WM_KEYDOWN, $vkKey, 0)
    EndIf
    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    EndFunc ;==>_KeyProc

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

    Func Print($s)
    ConsoleWrite($s & @CRLF)
    EndFunc

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

    Func OnAutoItExit()
    _WinAPI_UnhookWindowsHookEx($hHook)
    DllCallbackFree($hStub_KeyProc)
    EndFunc ;==>OnAutoItExit

    [/autoit]

    Mfg
    monkey

    Monkey - die finale Potenz von göttlich!
    Sloganizer

  • Hier mal in Pastebin: http://pastebin.com/4n1ECA3j

    monkey: Ich geh mal davon aus, dass er das nicht kapiert, oder so nicht braucht ^^
    Edit: Doch is ne super Funktion ^^

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • So guten Morgen,

    ich habe mir jetzt mal was zusammen gebaut. Da ich aber diesen Thread weiterschreibe, scheint es erst mal nicht zu funktionieren ?(

    Ich starte zum Test Notepad, danach starte ich via F5 das Script

    Jetzt wird es komisch 8|

    Drücke ich nur a passiert im Notepad gar nichts, aber das Script beendet sich gleich.
    Drücke ich nur m wird in Notepad hwurst@doin.tld (genau so !!) geschrieben und danach beendet sich das Script

    Da ich den Code kopiert und angepasst habe, vermute ich mal einige Fehler.

    Hier mal mein Code:

    [autoit]

    HotKeySet("a#", "Vorname"); sendet "Hans" beim Drücken von "a#"
    HotKeySet("m#", "Nachname"); sendet "Wurst" beim Drücken von "m#"
    HotKeySet("mg#", "Email") ; sendet die Emailadresse "hwurst@domain.tld" beim Drücken von "mg#"
    HotKeySet("aus#", "Aus") ; Beendet die Macroanwendung

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

    While 1
    Sleep(100)
    WEnd

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

    Func Vorname()
    Send("Hans",1)
    EndFunc

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

    Func Nachname()
    Send("Wurst",1)
    EndFunc

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

    Func Email()
    Send("hwurst@domain.tld",1)
    EndFunc

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

    Func Aus()
    Exit
    EndFunc

    [/autoit]

    Es soll ja bei 3 verschiedenen Tastenkombinationen verschiedene Texte geschrieben werden. Das Script soll bei der 4. Tastenkombination sich beenden.

    Was ich auch nicht wirklich verstehe ist die Aussage aus der Hilfe. Kann mir das mal bitte jemand erläutern ?


    Gruss Hassan

  • Es ist klar, dass wenn du a drückst, die Funktion Aus aufgerufen wird, da du ja bei HotKeySet("aus#", "Aus") ein a am Anfang hast.
    Das gleiche gilt auch für HotKeySet("mg#", "Email"), dort steht ein m am Anfang.

    Versuchs mal so:

    [autoit]

    HotKeySet("#v", "Vorname")
    HotKeySet("#n", "Nachname")
    HotKeySet("#e", "Email")
    HotKeySet("#{ESC}", "Aus")

    [/autoit]

    Das Problem bei Send ist, dass es manchmal zu schnell sendet.
    Dafür gibts aber die Option 'SendKeyDelay'.

    Setz das an den Anfang deines Scripts:

    [autoit]

    Opt("SendKeyDelay", 10)

    [/autoit]


    Wenn es dann noch immer nicht gehen sollte, dann erhöhe den Wert bei 'SendKeyDelay'.

    MfG,
    H2112.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Hallo H2112

    danke für die Antwort. Damit ich es richtig verstehe, für Autit ist

    "a#" das gleiche wie "abc#" ?

    Das wäre aber uncool !

    Wie verwirkliche ich dann Hotkeys, die sehr ähnlich sind.

    Den Delay den Du beschreibst, gilt der für die "Annahme" der Zeichen via Tastatur, oder für das Senden aus dem Autoit Script ?

    Gruss Hassan

  • Für den Befehl HotKeySet schon, allgemein in AutoIt nicht.

    Mit dieser UDF kannst du dein Vorhaben verwirklichen:
    HotStrings - String hotkeys

    Die Option verändert die Zeitabstände, in denen Zeichen von dem Befehl Send gesendet werden.
    Wär doch blöd, wenn das die Tastaturdelay ändern würde. ;)

    MfG,
    H2112.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Also irgendwie geht hier gar nichts mehr:

    Spoiler anzeigen
    [autoit]

    Opt("SendKeyDelay", 50)
    HotKeySet("#v", "Vorname")
    HotKeySet("#n", "Nachname")
    HotKeySet("#e", "Email")
    HotKeySet("#{ESC}", "Aus")

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

    While 1
    Sleep(100)
    WEnd

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

    Func Vorname()
    Send("Hans",1)
    EndFunc

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

    Func Nachname()
    Send("Wurst",1)
    EndFunc

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

    Func Email()
    Send("hwurst@domain.tld",1)
    EndFunc

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

    Func Aus()
    Exit
    EndFunc

    [/autoit]

    Wenn ich das Autoit Script starte, und zu Notepad wechsle, bekomme ich beim Tippen von #v auf nur #v angezeigt ?

    und nun ???

    Gruss Hassan

    Nachtrag: Beim Icon im Tasktray steht "Script paused"

  • Bei mir funktioniert das Skript wie gewollt.
    Das einzige Problem ist, dass durch Windwos einige HotKeys schon deffiniert sind.

    Kommt das 'Script paused' gleich nach dem Start?
    Versuch mal das Häckchen bei 'Script paused' im Traymenü wegzumachen.

    MfG,
    H2112.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Ich bin echt am verzweifeln :wacko:

    Habe das Script als x32 und x64 kompliert. Nichts passiert

    Wenn ich dann mit der Maus über das Icon gehe und rechte oder linke Maustaste drücke, fängt es zu blinken an

    Das hier aber auch gar nichts passiert ....

    Gruss Hassan

  • Habe das Script mal so angepasst:

    Spoiler anzeigen
    [autoit]

    Opt("SendKeyDelay", 200)
    HotKeySet("#v", "Vorname")
    HotKeySet("#n", "Nachname")
    HotKeySet("#e", "Email")
    HotKeySet("#{ESC}", "Aus")

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

    While 1
    Sleep(100)
    WEnd

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

    Func Vorname()
    HotKeySet("#v")
    Send("Hans")
    HotKeySet("#v", "Vorname")
    EndFunc

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

    Func Nachname()
    HotKeySet("#n")
    Send("Wurst")
    HotKeySet("#n", "Nachname")
    EndFunc

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

    Func Email()
    HotKeySet("#e")
    Send("hwurst@domain.tld")
    HotKeySet("#e", "Email")
    EndFunc

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

    Func Aus()
    Exit
    EndFunc

    [/autoit]

    Nichts, nichts, nichts .... rein gar nichts passiert :cursing:

  • Ich kann den Fehler nicht nachvollziehen. Bei mir funktioniert alles so, wie es soll.

    Versuch es einmal mit anderen HotKeys.

    MfG,
    H2112.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%

  • Was ich dabei auch nicht verstehe.

    Wenn ich z.B. in Notepad bin, und dort #v tippe, dann möchte ich ja in Notepad nicht #v stehen haben, sondern den Vornamen.

    Ich würde hier jetzt eigentlich den String #vHans erwarten.

    Da bei mir gerade aber gar nichts passiert, hänge ich voll in der Luft

  • "#v" steht für 'Windowstaste + v".
    Nicht für "Raute + v".

    Schau dir mal in der Hilfe genau den Befehl Send an.

    MfG,
    H2112.

    Zitat

    [Heute, 11:39] Raupi: Soll ich es dir machen?
    [Heute, 11:47] BugFix: "Soll ich es dir machen? " - also Raupi !! bitte nicht so öffentlich :rofl:

    Zitat

    [Heute, 11:51] BugFix: und ich werde es mir jetzt machen - das Mittagessen :P

    AMsg UDF v1.00.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%
    OwnStyle UDF Version 1.10.00 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 100%