Tech-Ecke / Delphi Inhalt / Tastatureingabe (Tastendruck) simulieren

 

     Tastatureingabe (Tastendruck) simulieren

 

   PostKeyEx32

PostKeyEx32 hat sich bei mir bislang immer als Notanker für besonders harte Fälle bewährt, dies sind in der Regel Tastenkombinationen (Hotkeys) wie z.B. ALT+F10 und dergleichen. Leider kann man mit PostKeyEx32 nur einen Tastendruck auf dem aktuellen Fenster simulieren und nicht gezielt an eine Anwendung senden, daher ist es nötig, das betroffene Fenster in den Vordergrund zu holen und sicherzustellen, dass es nicht minimiert ist. Zunächst aber mal der Quellcode PostKeyEx32:

  procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
type TShiftKeyInfo = record shift: Byte; vkey: Byte; end; byteset = set of 0..7;
const shiftkeys: array [1..3] of TShiftKeyInfo = ((shift: Ord(ssCtrl); vkey: VK_CONTROL),(shift: Ord(ssShift); vkey: VK_SHIFT),(shift: Ord(ssAlt); vkey: VK_MENU));
var flag: DWORD; bShift: ByteSet absolute shift; i:Integer;
begin
for i := 1 to 3 do
   begin
      if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0);
   end;
if specialkey then flag := KEYEVENTF_EXTENDEDKEY else flag := 0;
keybd_event(key, MapvirtualKey(key, 0), flag, 0);
flag := flag or KEYEVENTF_KEYUP;
keybd_event(key, MapvirtualKey(key, 0), flag, 0);
for i := 3 downto 1 do
   begin
      if shiftkeys[i].shift in bShift then keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),KEYEVENTF_KEYUP, 0);
   end;
end;

Quelle: Delphi-Praxis

Beispiel:

Zunächst wird der Handle des gewünschten Fensters benötigt, wie man diesen bekommt steht hier. Im Beispiel nehme ich mal Notepad, welches über den Fensternamen gefunden wird.

   var   wndMain: HWND;
 
 wndMain := FindWindow('Notepad',nil);  // Handle von Notepad mit leerem Textdokument


 ShowWindow(wndMain, SW_MAXIMIZE);   // Fenster Maximieren
 SetForegroundWindow(wndMain);              // als aktives Fenster setzen
 PostKeyEx3
2($4F, [ssCtrl], False);        // Tastenkombination STRG+O;  ALT+F8 wäre PostKeyEx32(VK_F8, [ssAlt], False); 

 

Tasten:  Alt :  [ssAlt]          STRG :  [ssCtrl]          Shift :  [ssShift]          Ohne: []

Weitere Tastencodes gibt es hier.




   EnterText

Die hier gezeigte Prozedur simuliert, wie auch PostKeyEx32  eine Tastatureingabe auf das aktuelle ForeGroundWindow, jedoch können hier komplette Strings auf einmal übergeben werden. Diese Variante berücksichtigt auch die Shift-, Alt- und Ctrl-Taste sowie Sonderzeichen.

  procedure EnterText(AText: String);
   var lCount : Integer;
   lScanCode : Smallint;
   lWithAlt,
   lWithCtrl,
   lWithShift : Boolean;
begin
   for lCount := 1 To Length(AText) Do
      begin
         lScanCode := VkKeyScan(AText[lCount]);
         //Ermitteln ob Shift gedrückt wurde
         lWithShift := lScanCode and (1 shl 8) <> 0;
         //Ermitteln ob Strg gedrückt wurde
         lWithCtrl := lScanCode and (1 shl 9) <> 0;
         //Ermitteln ob Alt gedrückt wurde
         lWithAlt := lScanCode and (1 shl 10) <> 0;

         if lWithShift then keybd_event(VK_SHIFT, 0, 0, 0);
         if lWithCtrl then keybd_event(VK_CONTROL, 0, 0, 0);
         if lWithAlt then keybd_event(VK_MENU, 0, 0, 0);

         keybd_event(lScanCode, 0, 0, 0);
         keybd_event(lScanCode, 0, KEYEVENTF_KEYUP, 0);

         if lWithAlt then keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
         if lWithCtrl then keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
         if lWithShift then keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
      end;
end;
 

Beispiel:

Aufgerufen wird das Ganze dann über (var MeinText: String):

   EnterText(MeinText);

Quelle: Delphi-Praxis

"Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !"

[letzte Aktualisierung 09.10.2006]