2012-10-18 98 views
5

Ich muss programmgesteuert ein Zeichen in eine Zelle eines Delphi-Rasters eingeben (in anderen Anwendungen).Tastatureingabe in Delphi mit WinAPI simulieren

Um dies manuell zu tun, sind folgende Schritte erforderlich:

  1. Drücken Sie die F3-Taste.
  2. Drücken Sie dreimal die rechte Pfeiltaste.
  3. Drücken Sie die Leertaste.
  4. Geben Sie den Buchstaben "E" auf der Tastatur ein.
  5. Drücken Sie die Nach-rechts-Taste.

    // Press F3 button   
    keybd_event(VK_F3, 0, 0, 0);   
    // Press right arrow key 3 times 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    
    // Press the space button 
    keybd_event(VK_SPACE, 0, 0, 0); 
    
    // Type letter E 
    keybd_event(Ord('E'), 0, 0, 0); 
    
    // Move to the right 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    

Aber es funktioniert nicht. Wenn ich diesen Code ausführe, scheint nichts zu passieren.

Wie soll ich diesen Code ändern, so dass er tatsächlich Benutzereingaben simuliert?

+0

Ich habe etwas über ['virtuelle Tastatur'] (http://stackoverflow.com/a/12565963/960757) vor einiger Zeit gemacht (und es wird viele andere geben). Aber zu Ihrem Problem, wenn Sie auf TStringGrid zielen, denke ich, dass Sie nichts anderes tun können, als es zu fokussieren und Ihre Tastenanschläge zu simulieren (wenn ich mich recht erinnere, antwortet TStringGrid auf keine Art von Nachricht, die das würde in der Lage sein, den Text einer Zelle festzulegen). – TLama

+0

In dieser speziellen Anwendung können Werte nur über die Tastatur in dieses Raster eingegeben werden. Ich habe dies bereits mit AutoHotKey und MS UI Automation gemacht, muss diesen Code nun aber in Delphi neu schreiben. –

+0

Ich kann mich nicht darauf verlassen, dass das Raster fokussiert wird, da sich auf dem Zielsystem ein Programm befindet, das sich alle 200 Millisekunden selbst aktiviert. –

Antwort

9

Jeder Tastendruck ist eine Taste nach unten und dann eine Taste nach oben. Sie benötigen also zwei Anrufe an keybd_event per Tastendruck. Zum Beispiel, drücken Sie F3:

keybd_event(VK_F3, 0, KEYEVENTF_KEYDOWN, 0); 
keybd_event(VK_F3, 0, KEYEVENTF_KEYUP, 0); 

Beachten Sie, dass KEYEVENTF_KEYDOWN nicht wirklich definiert durch die Windows-Header-Dateien, oder die Delphi-Übersetzung. Definieren Sie es als 0. Es macht den Code jedoch deutlicher explizit ausgeschrieben.

Natürlich würden Sie Ihren Code nicht mit gepaarten Anrufen an keybd_event verschwenden. Stattdessen würden Sie die gepaarten Anrufe in eine Hilfsfunktion einfügen.

Es ist möglich, dass Sie in einigen Situationen den zweiten Parameter, den Scan-Code, angeben müssen. Aber es ist oft nicht notwendig.

+0

Danke. Funktioniert 'keybd_event', wenn das betreffende Steuerelement NICHT fokussiert ist? –

+0

@DmitriPisarenko Nicht, dass es nicht. Eingabenachrichten werden mit dem Eingabefokus an das Steuerelement gesendet. –

+0

Ist es möglich, 'keybd_event' Aufrufe durch das Senden von Windows-Nachrichten an das Grid zu ersetzen? –