如何使用SendMessage发送按键组合,例如:Ctrl+A
解决后立即给分

解决方案 »

  1.   

    var
      hwnd : Integer;
    begin
      hwnd := FindWindow('Notepad', nil);
      SetForegroundWindow(hwnd);
      keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
      keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), 0, 0);
      keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), KEYEVENTF_KEYUP, 0);
      keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0)
    end;
      

  2.   

    试用 keybd_event 我会,我要的是SendMessage
      

  3.   

    var
      hwnd : Integer;
    begin
      hwnd := FindWindow('Notepad', nil);
      SetForegroundWindow(hwnd);
      keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
      keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), 0, 0);
      keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), KEYEVENTF_KEYUP, 0);
      keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0)
    end;
      

  4.   

    hwnd := FindWindow('notepad', nil);
      SendMessage(hwnd, WM_COMMAND, 7, 0);
      

  5.   

    好象是不能一次发的
    你可以这样 先设定ctrl键的状态为按下状态 函数忘记了 
    然后SendMessage(hwnd, WM_KEYDOWN, 'a', 0);
      

  6.   

    --------------第一种方法------------
    这种方法在中文输入法打开的情况下中西文都正常,
    但我不想用这种费事的办法.
    ------------------------------------
    //模拟按键函数
    procedure TForm1.SendKeys(sSend:string);
    var
        i:integer;
        Sstr:string;
        focushld,windowhld:hwnd;
        threadld:dword;
        ch: byte;
    begin
      windowhld:=GetForegroundWindow;
      threadld:=GetWindowThreadProcessId(Windowhld,nil);
      AttachThreadInput(GetCurrentThreadId,threadld,true);
      Focushld:=getfocus;
      getcursorpos(p); //查鼠标坐标
      Focushld:=WindowFromPoint(p); //返回句柄
      AttachThreadInput(GetCurrentThreadId,threadld,false);
      if (focushld=0) or
         (focushld=Self.Memo1.Handle) or
         (focushld=Self.Edit1.Handle) or
         (focushld=Self.Edit2.Handle) or
         (focushld=SpinEdit1.Handle)  then
        begin
           Exit;
        end;
      i := 1;
      while i <= Length(sSend) do
      begin
        ch := byte(sSend[i]);
        if Windows.IsDBCSLeadByte(ch) then
          begin
             Inc(i);
             SendMessage(focushld, WM_IME_CHAR, MakeWord(byte(sSend[i]), ch), 0);
          end
        else
          begin
             SendMessage(focushld, WM_IME_CHAR, word(ch), 0);
          end;
        Inc(i);
      end;
      SendMessage(focushld, WM_IME_CHAR, word(13), 0);
    end;//定时器定时发送字符
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
       SendKeys('ABCD1234大话西游');
    end;--------------第二种方法------------
    这种方法用拷贝-粘贴的方式,在记事本下正常,
    但在WORD下毫无反应!
    ------------------------------------
    procedure TGoodDictForm.SendKey();
    var
        i:integer;
        focushld,windowhld:hwnd;
        threadld:dword;
        ch: byte;
    begin
      windowhld:=GetForegroundWindow;
      threadld:=GetWindowThreadProcessId(Windowhld,nil);
      AttachThreadInput(GetCurrentThreadId,threadld,true);
      getcursorpos(p); //查鼠标坐标
      Focushld:=WindowFromPoint(p); //返回句柄
      AttachThreadInput(GetCurrentThreadId,threadld,false);
      if (focushld=0) or (focushld=Self.Memo1.Handle) then
        begin
           Exit;
        end;
      SendMessage(focushld, WM_Paste, 0, 0);
    end;//定时器定时发送字符
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
       Edit1.SelectAll;
       Edit1.CopyToClipboard;
       SendKeys();
    end; To kingkong
    要正確送出中文字符一定要依照微軟的IME機制, 單純用SendMessage
    是不能夠的. 你可以把要送出的字符放在剪貼板中, 使用keybd_event
    這個API送出 Ctrl 與 V 兩鍵的組合. 就能夠把中英文字串放到Word
    等軟件中, 
    keybd_event(VK_CONTROL, 0, 0, 0);
    keybd_event(Ord('v'),   0, 0, 0);
    keybd_event(Ord('v'),   0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);uses sendkey32
    {+ = Shift
    ^ = Control
    % = Alt}
    SendKeys('^X',true); 
    发送 Control+X消息
      

  7.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      KeyState: TKeyboardState;
    begin
      GetKeyboardState(KeyState);
      KeyState[VK_CONTROL] := not KeyState[VK_CONTROL]; // ctrl->down
      SetKeyboardState(KeyState);
      SendMessage(Form1.Handle, WM_KEYDOWN, WPARAM('A'), 0);
      GetKeyboardState(KeyState);
      KeyState[VK_CONTROL] := not KeyState[VK_CONTROL]; // ctrl->up
      SetKeyboardState(KeyState);
    end;procedure MyKeyDown(var msg: TWMKeyDown);message WM_KEYDOWN;procedure TForm1.MyKeyDown(var msg: TWMKeyDown);
    begin
      if GetKeyState(VK_CONTROL) < 0 then
      begin
        ShowMessage('Ctrl + ' + Chr(msg.CharCode)); // it's OK.
      end;
      inherited;
    end;ply try it.
      

  8.   

    谢谢大家,不过这几种方法我都试过,不行的
    我是控制其它程序用,发送 Ctrl+A, 全选SetKeyboardState(KeyState); 的方法没有作用。
    一楼 keybd_event 的方法需要切换焦点,不适用
      

  9.   

    hwnd := FindWindow('notepad', nil);
      SendMessage(hwnd, WM_COMMAND, 7, 0);>>>>>>>>>>>>>>>>
    不是给你这个了吗?有些程序是通过WM_COMMAND快捷键的
      

  10.   

    beyondtkl(大龙驹)的方法是可行的!
      

  11.   

    to  cnhgj(戏子) (一个人睡) hwnd := FindWindow('notepad', nil);
      SendMessage(hwnd, WM_COMMAND, 7, 0);这个好像只有nodepad中才行,是nodepad特有的?
      

  12.   

    tmd,看见一字不动照抄别人回复的就来气