var Form1: TForm1; winresult:hwnd; forgrund:hwnd; doswin:hwnd; hscreen:THandle; implementation
{$R *.DFM} 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 flags: TShiftState; begin flags := []; hScreen := CreateConsoleScreenBuffer(GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE,nil, CONSOLE_TEXTMODE_BUFFER,nil); doswin:=FindWindow(nil,'Shareware information'); SetActivewindow(doswin); sendtext('Her skal du skrive din tekst'); PostKeyEx32(9, flags, false); end;
procedure TForm1.FormClick(Sender: TObject); begin Application.Terminate; end;
Det der ser nu meget godt men jeg kan ik få det til at sende key til det andet program. Der sker slet ik noget når trykker på den knap som jeg har lavet til at sende key #5 på tastaturet ;/
Tror du, du kan lave et eksemple der virker til mig ?
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin if Key <> #8 then Caption := Caption + Key else if (Caption <> '') then Caption := Copy(Caption, 1, Length(Caption) - 1) ; end ; When we fire up Program2, we first look for Program1 with the FindWindow API function. Assuming that it is running, we save its handle to a property entitled Program1Handle: procedure TForm1.FormCreate(Sender: TObject); begin Program1Handle := FindWindow(nil, 'Program1') ; if Program1Handle = 0 then begin ShowMessage('Program1 is not running!!') ; Application.Terminate ; end ; end ; When the user types into an edit control in Program2, the following OnKeyPress event is run, which uses the SendMessage API function to effectively lob that key to the other program. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin SendMessage(Program1Handle, WM_CHAR, Ord(Key), 0) ; end ;
vel det er jo lige det der ik virker til det jeg skal bruge. jeg kan ik få det til at sende et key pres til et andet program (ik en hel text line, som det der gør).
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.