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; |
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
PostKeyEx32($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):
|