Avatar billede azs Nybegynder
06. marts 2003 - 01:10 Der er 23 kommentarer og
1 løsning

Send key til program

Hvordan kan jeg fx sende key 5 (nr5 på  mit tastatur ik numpad) til et andet program? Det samme med fx Shift+5, hvordan kan man det?
Avatar billede hermandsen Juniormester
06. marts 2003 - 07:35 #1
Kopieret fra tidligere svar:
http://www.eksperten.dk/spm/111679

Tilføj ShellApi til Uses

keybd_event(ord('A'),0,0,0); // nedtrykker et 'A'
keybd_event(ord('A'),0,KEYEVENTF_KEYUP,0); // løfter tasten igen

For specielle taster såsom cursor op kan du bruge følgende:

keybd_event(vk_up,0,0,0);
keybd_event(vk_up,0,KEYEVENTF_KEYUP,0);

Så skulle det være til at gå til! ;)

//hermandsen
Avatar billede clscableguy Praktikant
06. marts 2003 - 07:57 #2
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

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;

end.
Avatar billede azs Nybegynder
06. marts 2003 - 14:03 #3
hermandsen -> hmm det besvare jo ik lige mit spm. Jeg ville vide hvordan man kunne sende key's til et andet program.

clscableguy -> cute kode men hvad gør den? og hvad er fx sendtext til?
Avatar billede clscableguy Praktikant
06. marts 2003 - 14:15 #4
doswin:=FindWindow(nil,'Notepad');
her find du det window/program du vil sende en key til

setactivewindow(doswin);
her gør du window'et active

sendtext er til at sende en hel sætning til window'et
postkeyex32 er til at sende et tastatur tryk til window'et
Avatar billede azs Nybegynder
06. marts 2003 - 14:17 #5
Og nu vi er igang ... er der nogen som har en liste over alle key's dvs hvad nr de har i key: Word ting :) ?
Avatar billede clscableguy Praktikant
06. marts 2003 - 14:21 #6
Avatar billede azs Nybegynder
06. marts 2003 - 14:24 #7
hmm ja hvad skal jeg tage efter som er key? HEX eller DEC ?
Avatar billede clscableguy Praktikant
06. marts 2003 - 14:32 #8
DEC
flags := []; { flags er noget som shift ctrl og alt }
PostKeyEx32(9, flags, false);
Avatar billede azs Nybegynder
06. marts 2003 - 14:34 #9
ok jeg prøver det lige igen så.
Avatar billede azs Nybegynder
06. marts 2003 - 14:44 #10
Avatar billede azs Nybegynder
06. marts 2003 - 15:11 #11
Avatar billede azs Nybegynder
06. marts 2003 - 15:05 #12
Avatar billede azs Nybegynder
06. marts 2003 - 14:52 #13
Avatar billede azs Nybegynder
06. marts 2003 - 14:59 #14
Avatar billede azs Nybegynder
06. marts 2003 - 23:10 #15
ehm hvad i all h til er der sket her ?
Avatar billede azs Nybegynder
06. marts 2003 - 23:36 #16
vel det jeg vil sige var

det virker men ikke helt som jeg troede det ville. kan man ik få det til at sende key's til et andet program uden at det skal ha focus?
Avatar billede clscableguy Praktikant
07. marts 2003 - 22:45 #17
ved ikke lige hvad der er sket, men her er løsningen til dit problem:

http://www.delphicollection.com/public/GregLief/gl_q&a93.html
Avatar billede azs Nybegynder
09. marts 2003 - 15:29 #18
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 ?
Avatar billede azs Nybegynder
09. marts 2003 - 15:30 #19
SENDING KEYPRESSES TO ANOTHER DELPHI APPLICATION

Kom lige til at se der står det i "topic" på den side. Kan det ik bruges til andre progs som fx er lavet i VB eller C++ ?
Avatar billede clscableguy Praktikant
09. marts 2003 - 17:44 #20
er det et eksemple i delphi eller var det forkert "topic" du har skrevet til
Avatar billede azs Nybegynder
11. marts 2003 - 15:15 #21
ja det er eksemple hvordan man i Delphi kan sende key presses til et andet program
Avatar billede clscableguy Praktikant
11. marts 2003 - 17:57 #22
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 ;
Avatar billede azs Nybegynder
12. marts 2003 - 00:14 #23
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).
Avatar billede azs Nybegynder
20. marts 2003 - 00:46 #24
lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester