本人想向莫一个窗体发送一个组合键消息,如Alt+A,可光标的焦点不一定在这个窗体上!
如果光标在我要发送的窗体上,可以:
keybd_event(VK_MENU, MapVirtualKey(VK_MENU,0), 0,0);
keybd_event(byte('A'), MapVirtualKey(byte('A'),0), 0,0);
keybd_event(byte('A'),MapVirtualKey(byte('A'),0), KEYEVENTF_KEYUP,0);
keybd_event(VK_MENU, MapVirtualKey(VK_MENU,0),KEYEVENTF_KEYUP,0);
若光标不在,不知道如何实现!
不知道能不能通过sendmessage或postmessage来实现!
多多指点,小弟在此谢过了!

解决方案 »

  1.   

    给你做了一个使用hotkey的例子
    接受按键消息的窗体代码如下,主要是注册一个hotkey来相应操作unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
        hotkeyid :integer; 
        procedure WMhotkeyhandle(var msg:Tmessage);
         message wm_hotkey;  end;var
      Form1: TForm1;implementation{$R *.DFM}
    procedure TForm1.Wmhotkeyhandle
    (var msg:Tmessage);
    begin
      //热键的处理消息
      if (msg.LParamHi=$41) and
         (msg.lparamLo=MOD_CONTROL or mod_Alt) then
      begin
        //在这里做你需要的操作
        msg.Result:=1;
      
        application.BringToFront;
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      //注册热键,这里通过在原子表中添加一项来保证hotkeyid
      //热键为ctrl+alt+a
      hotkeyid:=GlobalAddAtom(pchar('UserDefineHotKey'))-$C000;
      registerhotkey(handle,hotkeyid,MOD_CONTROL or mod_Alt,$41);end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
       unregisterhotkey(handle,hotkeyid);
       DeleteAtom(HotKeyID);
    end;end.在另外新建立一个工程,放一个按钮,代码如下
    procedure TForm1.Button1Click(Sender: TObject);
    var
      hd : THandle;
    begin
      hd := FindWindow(nil,'Form1');//判断那个接受消息的窗体是否存在
      if hd <> 0 then
      begin
        //按照你的思路,模拟按下ctr+alt+a
      keybd_event(VK_MENU, MapVirtualKey(VK_MENU,0), 0,0);
      keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0), 0,0);
      keybd_event(byte('A'), MapVirtualKey(byte('A'),0), 0,0);
      keybd_event(byte('A'),MapVirtualKey(byte('A'),0), KEYEVENTF_KEYUP,0);
      keybd_event(VK_MENU, MapVirtualKey(VK_MENU,0),KEYEVENTF_KEYUP,0);
      keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL,0),KEYEVENTF_KEYUP,0);
      end;
    end;以上程序,winxp+d7下测试通过。
      

  2.   

    unit UHotKey;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,MMSystem;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        //处理 WM_HOTKEY 事件
        procedure WmHotKey(var msg:TMessage); message WM_HOTKEY;
      public
        { Public declarations }
      end;var
      Form1: TForm1;const
      MY_HOTKEY: Integer = $0001;  //HotKey ID
      ALT_F3  :Integer =$0002;
      E :integer =$0003;
      L :integer =$0004;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      //使用前必须先注册热键
      if not RegisterHotKey(Self.Handle,MY_HOTKEY,0,VK_F3) then
      MessageDlg('注册热键失败',mtError,[mbOk],0);  if not RegisterHotKey(Self.Handle,ALT_F3,MOD_ALT,VK_F3) then
      MessageDlg('注册热键失败',mtError,[mbOk],0);  if not RegisterHotKey(Self.Handle,E,0,VK_F7) then
      MessageDlg('注册热键失败',mtError,[mbOk],0);
      if not RegisterHotKey(Self.Handle,L,0,VK_F8) then
      MessageDlg('注册热键失败',mtError,[mbOk],0);end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      //退出时撤销已经注册的热键
      if not UnRegisterHotKey(Self.Handle,MY_HOTKEY) then
      MessageDlg('撤销热键失败',mtError,[mbOk],0);
      if not UnRegisterHotKey(Self.Handle,ALT_F3) then
      MessageDlg('撤销热键失败',mtError,[mbOk],0);
      if not UnRegisterHotKey(Self.Handle,E) then
      MessageDlg('撤销热键失败',mtError,[mbOk],0);
      if not UnRegisterHotKey(Self.Handle,L) then
      MessageDlg('撤销热键失败',mtError,[mbOk],0);end;procedure TForm1.WmHotKey(var msg: TMessage);
    begin
      //热键激活的代码
    {   if msg.WParam = MY_HOTKEY then MessageDlg('got the f3 message',mtInformation,[mbOk],0)
       else if msg.WParam = ALT_F3 then MessageDlg('got the alt + f3hotkey message',mtInformation,[mbOk],0);
     }
       if msg.WParam = MY_HOTKEY then WindowState:=wsMaximized
       else if msg.WParam = ALT_F3 then WindowState:=wsNormal
       else if msg.WParam = E then mciSendString('set cdaudio door open wait',0,0,0)
       else if msg.WParam = L then mciSendString('set cdaudio door closed wait',0,0,0);end;end.
      

  3.   

    可能大家都误会我的意思了,接收组合键的是个EXE窗体,我是能做任何操作的!