Avatar billede emingos Nybegynder
22. maj 2004 - 22:31 Der er 4 kommentarer og
1 løsning

tryk enter i andet program

hejsa delphi hajer,

har sidet og surfet google rundt et par timer efterhånden
efter en måde at simulere et enter tryk i et andet program
jeg kan godt få den til at skrive ved at activere en form i programmmet med musen, men efter den har skrevet skal den trykke på enter.. og den kan jeg simpelthen ikke få til at virke.. her er en lille stump kode som jeg har prøvet, som i kan se har jeg både prøvet med keybd_event og som postmessage(handle... men det virker bare ikke..

procedure Simenter;
  var
  wnd: hwnd;
  begin
  wnd := FindWindow('LLS_SOME_CLASS', nil);
  SetForegroundWindow(wnd);
  PostMessage(wnd, WM_KEYDOWN, VK_RETURN, 0);
  PostMessage(wnd, WM_KEYUP, VK_RETURN, 0);
    //keybd_event(VK_RETURN, 1, 0, 0);
    //keybd_event(VK_RETURN, 1, KEYEVENTF_KEYUP, 0);
  end;
Avatar billede nlf Nybegynder
23. maj 2004 - 01:42 #1
Nu spørger jeg bare dumt, men du har vel styr på den klasse til det handle som du finder? Prøv med en if Wnd = 0 then ShowMessage('No handle'); I øvrigt behøver du ikke SetForeGround
Avatar billede emingos Nybegynder
23. maj 2004 - 13:17 #2
det program som jeg vil lave det til har samme class i hele programmet.. så jeg kan ikke bruge windowex til menuer, og der er ikke nogen send klap.. man skal trykke på enter
Avatar billede hreiff Nybegynder
26. maj 2004 - 08:00 #3
Jeg har set mig lidt omkring, og har fundet en unit:
Såvidt jeg kan gennemskue burde du kunne sende enter således:

SendKeysToTitle('LLS_SOME_CLASS', SK_ENTER);



unit SendKeys;

interface

uses
  Windows, SysUtils;

const
  SK_BKSP = #8;
  SK_TAB = #9;
  SK_ENTER = #13;
  SK_ESC = #27;
  SK_ADD = #107;
  SK_SUB = #109;
  SK_F1 = #228;
  SK_F2 = #229;
  SK_F3 = #230;
  SK_F4 = #231;
  SK_F5 = #232;
  SK_F6 = #233;
  SK_F7 = #234;
  SK_F8 = #235;
  SK_F9 = #236;
  SK_F10 = #237;
  SK_F11 = #238;
  SK_F12 = #239;
  SK_HOME = #240;
  SK_END = #241;
  SK_UP = #242;
  SK_DOWN = #243;
  SK_LEFT = #244;
  SK_RIGHT = #245;
  SK_PGUP = #246;
  SK_PGDN = #247;
  SK_INS = #248;
  SK_DEL = #249;
  SK_SHIFT_DN = #250;
  SK_SHIFT_UP = #251;
  SK_CTRL_DN = #252;
  SK_CTRL_UP = #253;
  SK_ALT_DN = #254;
  SK_ALT_UP = #255;

procedure SendKeyString(Text: String);
procedure SendKeysToTitle(WindowTitle: String; Text: String);
procedure SendKeysToHandle(WindowHandle: hWnd; Text: String);
procedure MakeWindowActive(wHandle: hWnd);
function GetHandleFromWindowTitle(TitleText: String): hWnd;

implementation

procedure SendKeyString(Text: String);
var
  i: Integer;
  Shift: Boolean;
  vk, ScanCode: Word;
  ch: Char;
  c, s: Byte;
const
  vk_keys: Array[0..9] of Byte =
      (VK_HOME, VK_END, VK_UP, VK_DOWN, VK_LEFT,
      VK_RIGHT, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE);
  vk_shft: Array[0..2] of Byte = (VK_SHIFT, VK_CONTROL, VK_MENU);
  flags: Array[False..True] of Integer = (KEYEVENTF_KEYUP, 0);
begin
  Shift := False;
  for i := 1 to Length(Text) do
    begin
    ch := Text[i];
    if ch >= #250 then
      begin
      s := Ord(ch) - 250;
      Shift := not Odd(s);
      c := vk_shft[s shr 1];
      ScanCode := MapVirtualKey(c,0);
      Keybd_Event(c, Scancode, Flags[shift], 0);
      end
    else
      begin
      vk := 0;
      if ch >= #240 then
        c := vk_keys[Ord(ch) - 240]
      else
        if ch >= #228 then {228 (F1) => $70 (vk_F1)}
        c := Ord(ch) - 116
        else
        if ch < #110 then
          c := Ord(ch)
        else
          begin
          vk := VkKeyScan(ch);
          c := LoByte(vk);
          end;
      ScanCode := MapVirtualKey(c,0);
      if not Shift and (Hi(vk) > 0) then { $2A = scancode of VK_SHIFT }
        Keybd_Event(VK_SHIFT, $2A, 0, 0);
      Keybd_Event(c,scancode, 0, 0);
      Keybd_Event(c,scancode, KEYEVENTF_KEYUP, 0);
      if not Shift and (Hi(vk) > 0) then
        Keybd_Event(VK_SHIFT, $2A, KEYEVENTF_KEYUP, 0);
      end;
    end;
end;

procedure MakeWindowActive(wHandle: hWnd);
begin
  if IsIconic(wHandle) then
  ShowWindow(wHandle, SW_RESTORE)
  else
  BringWindowToTop(wHandle);
end;

function GetHandleFromWindowTitle(TitleText: String): hWnd;
var
  StrBuf: Array[0..$FF] of Char;
begin
  Result := FindWindow(PChar(0), StrPCopy(StrBuf, TitleText));
end;

procedure SendKeysToTitle(WindowTitle: String; Text: String);
var
  Window: hWnd;
begin
  Window := GetHandleFromWindowTitle(WindowTitle);
  MakeWindowActive(Window);
  SendKeyString(Text);
end;

procedure SendKeysToHandle(WindowHandle: hWnd; Text: String);
begin
  MakeWindowActive(WindowHandle);
  SendKeyString(Text);
end;

end.
Avatar billede emingos Nybegynder
27. maj 2004 - 10:26 #4
hmm hreiff det virker, men kun når man aktivere det vindue som skal skrives i,... det gør dog ikke så meget tror jeg, da det er aktivt i forvejen, jeg prøver lige at implementere det i mit program, så vender jeg tilbage..
Avatar billede emingos Nybegynder
27. maj 2004 - 10:34 #5
for cool det virker bare som det skal.. mange tak for hjælpen begge to :O)
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