nca
Juniormester
06. januar 2002 - 18:15
#2
Nedenstående eksempel sender 2+2= til lommeregneren, som så viser resultatet 4
unit sendkeyUnit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
winresult:hwnd;
forgrund:hwnd;
doswin:hwnd;
hscreen:THandle;
implementation
{$R *.DFM}
procedure PushKeys(Keystrokes : PChar); stdcall; external \'KeyPush.DLL\';
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; { For }
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; { For }
End; { PostKeyEx32 }
Procedure SendText( S: String );
Var
flags: TShiftState;
vcode: word;
ret : word;
i, n : Integer;
mask : word;
Begin
For i := 1 To Length(S) Do Begin
ret := VkKeyScan( S[i] );
vcode := Lobyte( ret );
flags := [];
mask := $100;
For n := 1 To 3 Do Begin
If (ret and mask) <> 0 Then Begin
Case mask Of
$100: Include( flags, ssShift );
$200: Include( flags, ssCtrl );
$400: Include( flags, ssAlt );
End; { Case }
End; { If }
mask := mask shl 1;
End; { For }
PostKeyEx32( vcode, flags, false );
End; { For }
End; { SendText }
procedure TForm1.Button1Click(Sender: TObject);
var
kommando:string;
begin
hScreen := CreateConsoleScreenBuffer(GENERIC_READ, FILE_SHARE_READ or
FILE_SHARE_WRITE,nil, CONSOLE_TEXTMODE_BUFFER,nil);
kommando:=\'calc.exe\';
Winresult:=WinExec(Pchar(kommando),sw_shownormal);
doswin:=FindWindow(nil,\'Lommeregner\');
SetActivewindow(doswin);
sendtext(\'2+2=\');
end;
end.