如何向其他程序的窗口发送组合键?如向“记事本”的窗口发送:
Alt+F 或 Ctrl+C 键?

解决方案 »

  1.   

    简单!!
    先用FindWindow("Notepad","无标题 - 记事本")
    找到记事本的句柄,再用keybd_event等发送消息
      

  2.   

    to CDSoftwareWj(95927) : 请你写出一个能运行的源代码出来,谢谢了先!
      

  3.   

    VB有一个Sendkey函数做这个。但Delphi没有。
      

  4.   

    点到为止 hehe^^都说到这分上了,还不行呀,试试就出来了另:
      keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), 0 , 0 );     // Alt down 
      keybd_event( VK_DOWN, MapVirtualKey( VK_DOWN, 0 ), 0 , 0 );     // down arrow key down 
      keybd_event( VK_DOWN, MapVirtualKey( VK_DOWN, 0 ), KEYEVENTF_KEYUP , 0 );  // down arrow key up 
      keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), KEYEVENTF_KEYUP , 0 ); ----------------------------------
       Ctrl: VK_CONTROL
       SHIFT:VK_SHIFT
       TAB:  VK_TAB
       'A':  byte('A')自己试试吧,很简单的
      

  5.   

    keybd_event是先Down再Up完全是按按键盘的动作来的to Wnyu(创业 -- 第一个目标是开一家软件公司)
    Delphi 没有吗?????
      

  6.   

    当然了首先先将你要发送的窗口聚焦,setforewindowpos
    另:
      keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), 0 , 0 );     // Alt down 
      keybd_event( VK_DOWN, MapVirtualKey( VK_DOWN, 0 ), 0 , 0 );     // down arrow key down 
      keybd_event( VK_DOWN, MapVirtualKey( VK_DOWN, 0 ), KEYEVENTF_KEYUP , 0 );  // down arrow key up 
      keybd_event( VK_MENU, MapVirtualKey( VK_MENU, 0 ), KEYEVENTF_KEYUP , 0 ); 
      

  7.   

    为什么不能用SendMessage(windowHandle,wm_keydown,..,) 之类的 ?to  CDSoftwareWj(95927) :你倒是写个能运行的代码来啊。
    我是这样写的,不能关闭记事本,只能关闭本程序:procedure TForm1.Button1Click(Sender: TObject);
    var
      h:THandle;
    begin
      h:=findWindow('Notepad',nil);
      setActiveWindow(h);
      keybd_event(vk_menu,mapvirtualkey(vk_menu,0),0,0);
      keybd_event(vk_f4,mapvirtualkey(vk_f4,0),0,0);end;
      

  8.   

    keybd_event(vk_menu,mapvirtualkey(vk_menu,0),0,0);
    keybd_event(vk_f4,mapvirtualkey(vk_f4,0),0,0);
    keybd_event(vk_f4,mapvirtualkey(vk_f4,0),KEYEVENTF_KEYUP ,0);
    keybd_event(vk_menu,mapvirtualkey(vk_menu,0),KEYEVENTF_KEYUP ,0);
    这样才是按键呢,有按有送嘛
    另要关闭就sendmessage(winhandle,wm_close,0,0)不就得了
      

  9.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      h:THandle;
    begin
      h:=findWindow('Notepad',nil);
      SetForegroundWindow(h);//<---看清这里!!!!!
      keybd_event(vk_menu,0,0,0);
      keybd_event(vk_f4,0,0,0);
      keybd_event(vk_f4,0,KEYEVENTF_KEYUP,0);
      keybd_event(vk_menu,0,KEYEVENTF_KEYUP,0);
    end;老大还没有解决呀!!My God~~~The SetActiveWindow function activates a window, but not if the application is in
    the background. 
      SetActiveWindow 用于激活一个 Window ,但是如果该 Window 所在的应用程序不在前台,
    该函数不起作用。
      The SetForegroundWindow function puts the thread that created the specified window 
    into the foreground and activates the window.
      SetForegroundWindow 函数先把程序激活,再把窗口激活。明白了吧,自己学的不精,还说人家不是高手 hehe^^
      

  10.   

    哎~~ 睡了一觉醒来,还要回答这个问题,帮人帮到底了方法你是用对了,不过API函数没有用对 hehe^^
      

  11.   

    收藏!
    To CDSoftwareWj(95927):
    VB的语句是: 
    SendKeys "{ALT}+{F4}"
    就这么简单, 这就是VB的好处, 也是VB的一个不好的地方。
    也要说句谢谢  :)
      

  12.   

    谢谢CDSoftwareWj(95927) !!那么使用 SendMessage 能否发送Ctrl+C键呢? 送佛送到西吧,我把分都给你。
      

  13.   

    hehe^^ 20哎一般我不用SendMessage发键盘消息,用SendMessage发组合键挺麻烦的
    好像要用LParam那个参数来配合,具体我没有试过
    SendMessage(H, WM_KEYDOWN, vKey, lParam);procedure SendShift(H: HWnd; Down: Boolean);
    var vKey, ScanCode, wParam: Word;
        lParam: longint;
    begin
      vKey:= $10;
      ScanCode:= MapVirtualKey(vKey, 0);
      wParam:= vKey or ScanCode shl 8;
      lParam:= longint(ScanCode) shl 16 or 1;
      if not(Down) then lParam:= lParam or $C0000000;
      SendMessage(H, WM_KEYDOWN, vKey, lParam);
    end;procedure SendCtrl(H: HWnd; Down: Boolean);
    var vKey, ScanCode, wParam: Word;
        lParam: longint;
    begin
      vKey:= $11;
      ScanCode:= MapVirtualKey(vKey, 0);
      wParam:= vKey or ScanCode shl 8;
      lParam:= longint(ScanCode) shl 16 or 1;
      if not(Down) then lParam:= lParam or $C0000000;
      SendMessage(H, WM_KEYDOWN, vKey, lParam);
    end;这是一点资料,我没有时间再去试了,你看着改改吧
      

  14.   

    谢谢你了,结贴!但用SendMessage有它的好处,不用将窗口激活就可以了。