我想给程序定义一个热键,就是程序没有焦点时也能通过热键执行。查了api函数,找到RegisterHotKey函数。其中有几个问题,请老鸟指教。procedure TMainForm.FormShow(Sender: TObject);
begin
  apphwnd:=GetModuleHandle('shoot');   //此处能得到程序的句柄吗???
  if RegisterHotKey(apphwnd,0,MOD_CONTROL+MOD_SHIFT,ord('C')) then
      MessageBox(0,'Error!','Error',MB_OK or MB_ICONERROR);
end;procedure TMainForm.WMSysCommand(var Msg: TWMSysCommand);  //这样监听热键行吗???
begin
   if (Msg.CmdType=SC_HOTKEY) then     //此处如何得到热键???    
          MessageBox(apphwnd,'Hot ok','ok',MB_OK)
   else
       DefaultHandler(Msg);
end;我刚学“消息”,很多地方不懂,还请各位高手耐心指教。  先谢了。

解决方案 »

  1.   

    RegisterHotKey函数原型及说明:
    BOOL RegisterHotKey(
      HWND hWnd,         // window to receive hot-key notification
      int id,            // identifier of hot key
      UINT fsModifiers,  // key-modifier flags
      UINT vk            // virtual-key code);
    参数 id为你自己定义的一个ID值,对一个线程来讲其值必需在0x0000 - 0xBFFF范围之内,对DLL来讲其值必需在0xC000 - 0xFFFF 范围之内,在同一进程内该值必须唯一
    参数 fsModifiers指明与热键联合使用按键,可取值为:MOD_ALT MOD_CONTROL MOD_WIN MOD_SHIFT
    参数 vk指明热键的虚拟键码 
    首先(举个例子):  
      RegisterHotKey(handle,globaladdatom('hot key'),MOD_ALT,vk_f12);
    然后在form中声明一个函数(过程):
      procedure hotkey(var msg:tmessage);message wm_hotkey;
    过程如下:
    procedure TForm1.hotkey(var msg:tmessage);
    begin
      if (msg.LParamHi=VK_F12) and (msg.LParamLo=MOD_ALT) then
      begin
       form1.show;
       SetForegroundWindow(handle);
      end;
    end;
    这样,不管你在什么地方,窗口就会显示出来。
    当然,你要GlobalDeleteAtom;unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        aatom:atom;
        procedure hotkey(var msg:tmessage);message wm_hotkey;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    begin
      aatom:=globaladdatom('hot key');
      RegisterHotKey(handle,aatom,MOD_ALT,vk_f12);
    end;procedure TForm1.hotkey(var msg:tmessage);
    begin
      if (msg.LParamHi=VK_F12) and (msg.LParamLo=MOD_ALT) then
        SetForegroundWindow(handle);
    end;