Simples Script will nicht funktionieren

  • Ok, ich vermute ainfach mal, das UDF "User defined function" bedeutet.

    Kannst du ganz grob umreißen, was deine Funktion bewirkt und auf welche Art. Nicht detailliertes. details kann ich mir dann ergooglen.

    LG

    PS: AutoIt ist viel umfangreicher und mächtiger, als man denken mag.

    EDIT: SendInput? Das finde ich nicht als Befehl/Funktion. Mein AutoIt scheint SendInput nicht zu kennen. *narf?*

    EDIT2: Gibt es einen guten Hilfetext, wo beschrieben steht, wie man grundsätzlich Funktionen aus DLL in AutoIt benutzbar macht? Wenn ich das generelle verstehe, muss ich nämlich nicht dauernd so blöde nachfragen. Google brachte da leider keine verständlichen Ergebnisse. SendInput ist eine user32.dll Funktion, soviel weiß ich wenigstens. Durch deine UDF ist sie also für AutoIt nutzbar gemacht. Wie aber ist dazu die Syntax? Wie bei Send?

    EDIT3: Ok, verstehe *lach*
    Also, wenn ich also nun

    [autoit]

    _SendUnicode("Mein Text mit Unicode Zeichen")

    [/autoit]


    aufrufe, werden (mir, was mache ich falsch?) keine Unicodes ausgegeben. {ASC...} kommt raw rüber, und Unicodes direkt als Text kommen als etwas merkwürdiges anderes herraus.

    EDIT4: Ahhhhhhhhhh... Oh nein, bin ich dumm. Steht doch alles da. Also, natürlich hast du recht, es funktioniert. Ich habe natürlich nicht genug nachgedacht etc. Kein Problem jetzt.

    Bleibt nur bitte, die ich schon erwähnte: Ein kurzes Umreißen, was die Funktion macht. Vielen Dank für deine Hilfe.

    3 Mal editiert, zuletzt von Exo1980 (27. Juli 2008 um 12:09)

    • Offizieller Beitrag

    Ich versuch mich mal dran, zu erklären. Falls ich irgendwo daneben liegen sollte: @progandy, bitte geraderücken ;-).
    Habe es als Kommentare vor die jeweilige Befehlszeile eingefügt:

    Spoiler anzeigen
    [autoit]

    Func _SendUnicode($text)
    ; Deklaration der Datenstruktur für die Konstante $tagINPUT_Keyboard:
    Local Const $tagINPUT_Keyboard = "DWORD type; ushort wVk; ushort wScan; DWORD dwFlags; DWORD time; ULONG_PTR dwExtraInfo;dword;ULONG_PTR;"
    ; Deklaration weiterer Konstanten:
    Local Const $INPUT_KEYBOARD = 1
    Local Const $KEYEVENTF_UNICODE = 0x4
    Local Const $KEYEVENTF_KEYUP = 0x2
    ; Deklaration der Variablen für den Dll-Strukturaufruf unter Verwendung der vorab deklarierten Konstante,
    ; 2 Input-tags derselben Struktur werden für den Dll-Call benötigt:
    Local $tinp = DllStructCreate($tagINPUT_Keyboard & $tagINPUT_Keyboard)
    Local $sendDLL = DllOpen("user32.dll")
    $text = StringSplit($text, "")
    ; für jedes Zeichen aus dem übergebenen Text werden die Daten in die Dll-Dtruktur übertragen
    ; korrelierende Werte jeweils um 6 Positionen versetzt zugewiesen ($tagINPUT_Keyboard mit je 6 Parametern 2-fach in der Struktur)
    For $i = 1 To $text[0]
    DllStructSetData($tinp, 1, $INPUT_KEYBOARD)
    DllStructSetData($tinp, 7, $INPUT_KEYBOARD)
    DllStructSetData($tinp, 2, 0)
    DllStructSetData($tinp, 8, 0)
    DllStructSetData($tinp, 3, AscW($text[$i]))
    DllStructSetData($tinp, 9, AscW($text[$i]))
    DllStructSetData($tinp, 4, $KEYEVENTF_UNICODE)
    DllStructSetData($tinp, 10, BitOR($KEYEVENTF_KEYUP, $KEYEVENTF_UNICODE))
    DllStructSetData($tinp, 5, 0)
    DllStructSetData($tinp, 11, 0)
    DllStructSetData($tinp, 6, 0)
    DllStructSetData($tinp, 12, 0)
    ; der Dll-Call mit den in die Struktur eingesetzten Daten sendet den Unicode für dasZeichen
    $ret = DllCall($sendDLL, "uint", "SendInput", "uint", 1, "ptr", DllStructGetPtr($tinp), "int", 28)
    Next
    DllClose($sendDLL)
    EndFunc ;==>_SendUnicode

    [/autoit]
  • Vielen Dank, BugFix.

    Den Rest der Infos kann ich mir mit deinen Kommentaren als Grundlage hinzubesorgen. :)

    Jetzt bleibt nur noch ein Problem, bis ich mein Zeil erreicht habe.

    Das Spiel, für das ich dieses Programm schreibe, erkennt den Unicode nicht, obwohl es Unicode unterstützt. Unicodes werden dort oft in Nicknames benutzt.
    Wenn ich nun also per Hotkey den text in Notepad ausgeben lasse, ist alles perfekt.

    Wenn ich den Text im Spiel ausgeben lasse, geht es nicht. Lasse ich den Text aber in Notepad ausgeben, und kopiere ihn ins Spiel, sieht es auch perfekt aus.
    Das ist etwas, was mir nicht so recht einleuchtet.
    Im Übrigen ist es bei Skype das Gleiche. Die Unicodes einzeln werden korrekt ausgegeben, wenn ich allesdings das Program den Text per Hotkey einfügen lasse, sieht es so aus wie im Spiel.

    Das ist etwas, das wohl tief ins Innere der Materie eindringt. Woher kommt das, und wie kann man das verhindern. Die Programme (beide, das Spiel und Skype) unterstützen Unicodes doch eigentlich.

    LG