SendKeys & Sonderzeichen

  • VB6

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Mad Andy.

    SendKeys & Sonderzeichen

    Hi, Leute!

    Ich bin gerade dabei, ein kleines Programm zu schreiben, das auf Druck einer bestimmten Tastenkombination (z.B. ALT + STRG + E) per SendKeys ein Sonderzeichen in die Anwendung "sendet", die gerade aktiv ist (Word). Die Idee dahinter ist, dass man dann nicht ständig umständlich die Windows Zeichentabelle benutzen muss.

    Ich frage also mit "GetAsyncKeyState" in einer Timer-Prozedur die gedrückten Tasten ab. Mit allen gewöhnlichen Buchstaben funktioniert das auch einwandfrei, aber nicht mit Sonderzeichen. Mit Sonderzeichen meine ich in diesem Fall richtige Sonderzeichen, wie arabische Schriftzeichen und Symbole der kyrillischen Schrift (halt alles, was man in der Zeichentabelle finden kann) - die natürlich nicht Mitglied der ASCII-Tabelle sind.

    Mich würde einfach mal interessieren, ob ihr mir da Lösungsvorschläge unterbreiten könntet, auf die ich noch nicht gekommen bin. Da das ganze keine Frage des Quellcodes ist, werde ich hier den selbigen auch erstmal nicht veröffentlichen (da er im Moment völlig uninteressant ist), sollte es notwendig werden, tu ich es natürlich.

    mfG

    Malcolm
    Irgendwo muss da ein Fehler in deinem Text sein. Entweder willst du Sonderzeichen senden oder von der Tastatur abfragen. Letzteres geht ja nicht, weil die Tastatur hat immer die gleichen Zeichen. Weil du schreibst, GetAsyncKeyState funktioniert nicht mit Sonderzeichen.

    Willst du also lediglich wissen, die du diese Zeichen mit "SendKeys" sendest? Ich würde sagen, garnicht, weil man sendet ja Tastendrücke, keine Strings.
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    In der Zeichentabelle gibt es ja unten in der Statusleiste die Anzeige "Tastenkombination: Alt+0164", diese müsstest du mit Sendkeys senden. Bei Unicode und sonstigen Zeichen, wo dies nicht ind er Zeichentabelle angezeigt wird, kommst du mit Sendkeys nicht weit.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Hi!

    Erstmal Danke für die Antworten!

    @Marcus Gräfe

    Ich rufe mit der API die vom User gedrückten Tasten ab und wenn eine bestimmte Kombination kommt (z.B. eben ALT + STRG + E), soll das Programm per SendKeys ein Sonderzeichen in das geöffnete (Word-) Programm senden. Sorry, wenn ich mich zuvor unklar ausgedrückt haben sollte.

    @Agent

    Ich weiß, was du meinst, aber unten in der Windows Zeichentabelle steht nicht "Alt + [Zahl]" sondern "U + [Zahl]", und damit kann ich so gar nichts anfangen, zumal die Zahl nicht dezimal, sondern hexadezimal dargestellt wird; das Umwandeln ist natürlich kein Problem, ich weiß nur nicht, was diese Zahl ist - der ASCII-Code wohl nicht.

    Beispiel:

    (auf dem Kopf stehendes "e", auch "Schwa" genannt)
    U + 0259

    "0x0259" ergibt dezimal "601", aber mit Alt + 601 bekommt man ein ganz anderes Zeichen, nämlich ein großes "y".

    Ich hoffe, ihr habt noch andere Vorschläge!

    mfG

    Malcolm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Malcolm“ ()

    Der Ansatz von Agent ist schon richtig - ich weiß aber nicht wie man von der Zeichentabelle auf den "Nummblockcode" kommt.


    so long..
    Andy

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mad Andy“ ()

    @Mad Andy

    Danke für die Antwort, aber das wusste ich schon. Das Problem ist erstens, dass meine Sonderzeichen keine ASCII-Codes haben (und die Zahlen in der Zeichentabelle so nicht funktionieren) und außerdem kann man - meines Wissens nach - per SendKeys immer nur einzelne Tasten simulieren und kein "Gedrückthalten" einer Taste vorspiegeln.

    mfG

    Malcolm
    per SendKeys immer nur einzelne Tasten simulieren und kein "Gedrückthalten" einer Taste vorspiegeln.

    Um Alt (%) gedrückt zu halten, benutzt man runde Klammern:

    Visual Basic-Quellcode

    1. sendkeys "%(0164)"

    Ich weiß nur nicht, ob man so einfach die zahlen dort eintragen kann oder ob es für den Nummernblock extra Zahlen/Kürzel gibt.

    Was den unicode angeht, 1 Unicode-zeichen = 2 Ascii-zeichen, also vielleicht einfach eine Funktion zum Umwandeln suchen?

    Edit: probier mal {NUMLOCK}
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agent“ ()

    Der Numblock ist von den "normalen" Zeichen getrennt - wie / ob man die mit Sendkeys anspricht, weiß ich nicht (ich bilde mit aber ein mit NUM1, NUM2, etc.). Im Notfall gibts ja noch KeybdEvent.


    1 Unicode-zeichen = 2 Ascii-zeichen
    Es gibt mehrere unterschiedliche Unicodes...
    Die Unicode-Font(s) von Office verwenden bis zu 32bit, wenn ich mich recht erinnere.

    Umwandeln kannst du ausschließen, da er ja nicht unbedingt den Heap manipulieren will. Per Sendkeys, sendet man quasi reelle Tastatureingaben - 2 Zeichen sind dann also auch 2 Zeichen im Word.


    so long..
    Andy
    Hi!

    Abermals vielen Dank für die Antworten!

    Ich bin schon einen großen Schritt weiter gekommen. Ich habe die Zeichen, die bei der Zeichentabelle in Hexadezimal stehen in Dezimal umgewandelt und statt im Notepad mal im Wordpad versucht, die Zeichen per Alt + Code darzustellen - und da geht es tadellos!

    Ebenso problemlos funktioniert das in einer RichTextFormat-Box unter Visual Basic, mit einer normalen Textbox jedoch nicht.

    Darauf gekommen bin ich über diese Tabelle.

    Das einzige Problem dürfte nun also sein, das Gedrückthalten der Alt-Taste zu simulieren.

    @Agent

    Weder

    Visual Basic-Quellcode

    1. sendkeys "%(0164)"
    noch

    Visual Basic-Quellcode

    1. SendKeys "%(vbKeyNumpad0 & vbKeyNumpad1 & vbKeyNumpad6 & vbKeyNumpad4)"


    funktioniert - leider, weder in der Textbox noch in der RTF-Box, auch nicht mit "normalen" ASCII-Zeichen.

    @Mad Andy

    Kannst du mir darüber sagen, wie man Unicode-Zeichen in einem Word-Dokument erzeugen kann?

    Ein Gedanke wär auch: Ich platziere eine RTF-Box auf meinem Formular und simuliere dann zur Laufzeit den gewünschten Buchstaben in der RTF-Box (per ALT + Ziffer), kopiere das Sonderzeichen in die Zwischenablage und füge es unter Word wieder ein - nur finde ich nirgendwo den Code, um dieses ALT + Ziffer per SendKeys zu simulieren.

    Ich hab leider nur Open Office und bräuchte daher jemanden, der Microsoft Office benutzt und mir sagt, ob Alt + 601 ein "umgedrehtes e" auf den Bildschirm zaubert.

    mfG

    Malcolm

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Malcolm“ ()

    Ich hab leider nur Open Office und bräuchte daher jemanden, der Microsoft Office benutzt und mir sagt, ob Alt + 601 ein "umgedrehtes e" auf den Bildschirm zaubert.
    Hast Glück.. ich hab für Makros vor kurzem erst wieder M$ Office rauf geschmissen ;)
    Jap, isn verkehrtes "e": Y <-- war beim einfügen ein verkehrtes "e"
    Interessant ist nur, dasses im Firefox (normale Textbox?) ein Y ist..

    Visual Basic-Quellcode

    1. Declare Sub keybd_event Lib "user32.dll" ( _
    2. ByVal bVk As Byte, ByVal bScan As Byte, _
    3. ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    · bVk
    Specifies a virtual-key code. The code must be a value in the range 1 to 254.

    · bScan
    Specifies a hardware scan code for the key.

    fdwFlags
    A set of flag bits that specify various aspects of function operation. An application can use any combination of the following predefined constant values to set the flags:
    KEYEVENTF_EXTENDEDKEY
    If specified, the scan code was preceded by a prefix byte having the value 0xE0 (224).
    KEYEVENTF_KEYUP
    If specified, the key is being released. If not specified, the key is being depressed.

    · dwExtraInfo
    Specifies an additional 32-bit value associated with the key stroke.
    Quelle: API-Guide


    Beispiel:

    Visual Basic-Quellcode

    1. Const VK_H = 72
    2. Const VK_E = 69
    3. Const VK_L = 76
    4. Const VK_O = 79
    5. Const KEYEVENTF_EXTENDEDKEY = &H1
    6. Const KEYEVENTF_KEYUP = &H2
    7. Private Declare Sub keybd_event Lib "user32.dll" ( _
    8. ByVal bVk As Byte, ByVal bScan As Byte, _
    9. ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    10. Private Sub Form_KeyPress(KeyAscii As Integer)
    11. 'Print the key on the form
    12. Me.Print Chr$(KeyAscii);
    13. End Sub
    14. Private Sub Form_Paint()
    15. 'KPD-Team 2000
    16. 'URL: [URL]http://www.allapi.net/[/URL]
    17. 'E-Mail: [EMAIL]KPDTeam@Allapi.net[/EMAIL]
    18. 'Clear the form
    19. Me.Cls
    20. keybd_event VK_H, 0, 0, 0 ' press H
    21. keybd_event VK_H, 0, KEYEVENTF_KEYUP, 0 ' release H
    22. keybd_event VK_E, 0, 0, 0 ' press E
    23. keybd_event VK_E, 0, KEYEVENTF_KEYUP, 0 ' release E
    24. keybd_event VK_L, 0, 0, 0 ' press L
    25. keybd_event VK_L, 0, KEYEVENTF_KEYUP, 0 ' release L
    26. keybd_event VK_L, 0, 0, 0 ' press L
    27. keybd_event VK_L, 0, KEYEVENTF_KEYUP, 0 ' release L
    28. keybd_event VK_O, 0, 0, 0 ' press O
    29. keybd_event VK_O, 0, KEYEVENTF_KEYUP, 0 ' release O
    30. End Sub
    Quelle: API-Guide

    Keycodes:

    Visual Basic-Quellcode

    1. Private Const VK_NUMLOCK = &H90
    2. Private Const VK_NUMPAD0 = &H60
    3. Private Const VK_NUMPAD1 = &H61
    4. Private Const VK_NUMPAD2 = &H62
    5. Private Const VK_NUMPAD3 = &H63
    6. Private Const VK_NUMPAD4 = &H64
    7. Private Const VK_NUMPAD5 = &H65
    8. Private Const VK_NUMPAD6 = &H66
    9. Private Const VK_NUMPAD7 = &H67
    10. Private Const VK_NUMPAD8 = &H68
    11. Private Const VK_NUMPAD9 = &H69
    12. Private Const VK_MENU = &H12 'ALT



    so long..
    Andy

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Mad Andy“ ()

    @Mad Andy

    Danke für deine Antwort!

    Ich hab mich ein bisschen über die Funktion keybd_event informiert und folgenden Code zusammengebastelt, an dem eigentlich nichts falsch sein dürfte, der aber dennoch nicht funktioniert. Ich höre dann in Wordpad immer nur ein dumpfes Geräusch, aber es kommt kein Zeichen zustande:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _
    3. ByVal bScan As Byte, ByVal dwFlags As Long, _
    4. ByVal dwExtraInfo As Long)
    5. Private Const KEYEVENTF_KEYUP = &H2
    6. Private Sub Timer1_Timer()
    7. keybd_event vbKeyMenu, 0, 0, 0
    8. keybd_event vbKeyNumpad6, 0, 0, 0
    9. keybd_event vbKeyNumpad6, 0, KEYEVENTF_KEYUP, 0
    10. keybd_event vbKeyNumpad0, 0, 0, 0
    11. keybd_event vbKeyNumpad0, 0, KEYEVENTF_KEYUP, 0
    12. keybd_event vbKeyNumpad1, 0, 0, 0
    13. keybd_event vbKeyNumpad1, 0, KEYEVENTF_KEYUP, 0
    14. keybd_event vbKeyMenu, 0, KEYEVENTF_KEYUP, 0
    15. End Sub


    vbKeyMenu ist "Alt".

    mfG

    Malcolm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Malcolm“ ()

    vbKey... ist äquivalent zu den VK_...-Konstanten

    Hab n bisschen rum gegooglet und absolut nix gefunden, außer, dass es bei VB-SendKeys keine Num-Zahlen gibt. Die C++-Implementation ist genauso, wie dus machst (also keybd_event). Evntl. noch ein Sleep dazwischen, ändert aber auch nix dran :(

    Hab aber grad ne andere Lösung: Zwischenablage
    Du könntest versuchen das Sonderzeichen in die Zwischenablage zu bekommen und nachher Strg+V zu senden :)


    so long..
    Andy
    Hi, MadAndy!

    Danke, dass du für mich gesucht hast, ich bin zu den selben Ergebnissen gekommen.

    Das mit der Zwischenablage war ja auch schon ein Gedanke von mir, nur dazu müsste ich das entsprechende Zeichen überhaupt erst einmal unter VB produzieren können. Die einzige Möglichkeit, die ich da sehe wäre, die Sonderzeichen in eine RTF-Datei speichern, sie in die RTF-Box einzulesen, manuell in die Zwischenablage zu kopieren und dann im Word wieder einzufügen. Problem dabei ist wiederum, dass das eingefügte Zeichen dann so klein ist wie es im RTF-Textfeld steht und nicht so groß wie der Rest des Textes in der Word-Datei. Das halte ich mir als allerletzte Möglichkeit in der Hinterhand.

    Ich habe zwar den ASCII-Code der Zeichen (601 für das umgedrehte "e"), aber bei

    Visual Basic-Quellcode

    1. MsgBox Chr(601)


    bringt Visual Basic nur ne Fehlermeldung raus, da die ASCII-Nummer natürlich nicht bekannt ist. Ich hab versucht, den String mittels StrConv irgendwie zu Unicode umzuwandeln, aber das sieht auch nicht sehr erfolgsversprechend aus.

    mfG

    Malcolm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Malcolm“ ()

    So spät noch wach?

    1. ASCII geht nur bis 127 (7 bit pro Zeichen)
    2. Wird wohl nix anderes als eine RTF oder Binär-Datei übrig bleiben
    3. Brauchst du dir um die Schriftformatierung keine Sorgen machen, wenn dus nicht via Strg+C aus der RTB kopierst, sondern direkt die 2 Bytes (oder wieviele das sind) in die Zwischenablage schreibst.
    Wie das geht bzw. weitere Infos zur Zwischenablage gibts auf vbarchiv unter dem Titel 'Zwischenablage im Griff' o.Ä.
    Am besten machst dus so: Zeichentabelle aufmachen, Zeichen in die Zwischenablage kopieren (strg+C) und dann schauen, was raus kommt, wenn du via VB die Zwischenablage ausliest.

    Hoffe mal der Denkanstoß bringt dich weiter :)
    Ich würde son Tool in Sachen Elektronik und Elektrotechnik eigentlich auch gebrauchen ;)


    so long..
    Andy

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mad Andy“ ()

    Hi!

    Also ich habe jetzt eigentlich alles probiert, was mir noch eingefallen ist, bis zum Speichern der Sonderzeichen in einer RTF-Datei und späterem Einlesen dieser Zeichen, aber auch das will nicht funktionieren.

    Leider kann ich den Inhalt der RTF-Datei hier nicht reinkopieren, da das Forum die Sonderzeichen nicht unterstützt, aber eigentlich geht es auch eher um den Dateizugriff. Ich hab es jetzt per FSO, sequentiell und binär versucht, aber ich bekomme beim Einlesen der RTF-Datei immer den selben Rückgabewert (ich hab die Sonderzeichen untereinander reingeschrieben, also in jeder Zeile ein Sonderzeichen):

    {\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fswiss\fcharset0 Arial;}{\f1\fswiss\fcharset238{\*\fname Arial;}Arial CE;}{\f2\fswiss\fprq2\fcharset0 Lucida Sans Unicode;}}
    {\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\f0\fs20\u601?\par
    \f1\'e8\par
    \'b3\par
    \f0\u331?\par
    \'d8\par
    \f1\'f5\par
    \'9c\par
    \f0\'9a\par
    \f1\'fb\par
    \f0\'9e\par
    \f1\'9f\par
    \f2\u404?\f0\par
    }


    Der Code dafür:

    Visual Basic-Quellcode

    1. Private Sub Form_Load()
    2. Dim Datei As String, strTemp As String
    3. Dim DateiNr As Integer
    4. Datei = App.Path & "\tmp.rtf"
    5. DateiNr = FreeFile
    6. Open Datei For Binary As DateiNr
    7. strTemp = Space(LOF(DateiNr))
    8. Get #DateiNr, , strTemp
    9. rtf1.Text = strTemp
    10. Close DateiNr
    11. End Sub


    Wie gesagt, ich habe es auch schon sequentiell und als Textdatei probiert. Auch der Ansatz, die Zeichen einfach in einer Ressourcendatei zu speichern und dann zur Laufzeit aufzurufen, funktioniert nicht. Ich kann die Sonderzeichen weder direkt einfügen (kommen nur Fragezeichen) noch per Numpad eingeben.

    Hat noch jemand eine Idee?

    mfG

    Malcolm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Malcolm“ ()

    Aus der Zeichentabelle kopieren und in Word einfügen funktioniert ja?!
    Dann kann ich dir nur nochmal zu herzen legen:
    Am besten machst dus so: Zeichentabelle aufmachen, Zeichen in die Zwischenablage kopieren (strg+C) und dann schauen, was raus kommt, wenn du via VB die Zwischenablage ausliest.
    Die Daten speicherst du dann in nen Buffer (zum Testen) oder in eine Binär-Datei (fürs fertige Programm dann) und versuchst die Zwischenablage mit diesen Daten "wiederherzustellen".


    so long..
    Andy
    Hi!

    Danke für den Hinweis. Dann muss ich ja nur noch wissen, wie man von Visual Basic aus auf die Windows Zeichentabelle zugreifen kann.. auch wenn es ziemlich umständlich ist. Hat da jemand eine Idee? Google gibt da nichts her (zumindest nicht sofern ich das sehe).

    mfG

    Malcolm
    Hi, MadAndy!

    Wie man die Zwischenablage benutzt, weiß ich, danke. Es ging mir eher darum, wie ich die Windows Zeichentabelle (mit den Sonderzeichen drin) öffnen soll (zur Laufzeit, das heißt mit VB-Befehlen). Ob es da irgendeine API für gibt oder soetwas...

    mfG

    Malcolm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Malcolm“ ()