解决方案 »

  1.   

    unit Unit1; 
    interface 
    uses 
    Windows, Messages, Forms, Dialogs, Classes, Controls, StdCtrls; 
    type 
    TForm1 = class(TForm) 
    Button2: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    private 
    {热键标识ID} 
    id: Integer; 
    procedure WMHotKey(var Msg : TWMHotKey); message WM_HOTKEY; 
    { Privat-Declarations} 
    public 
    { Public-Declarations} 
    end; 
    var 
    Form1 : TForm1; 
    implementation 
    {$R *.DFM} {捕获热键消息} 
    procedure TForm1.WMHotKey (var Msg : TWMHotKey); 
    begin 
    if msg.HotKey = id then 
    ShowMessage(’Ctrl+Alt+R键被按下!’); 
    form1.Visible :=true; 
    end; procedure TForm1.FormCreate(Sender: TObject); 
    Const 
    {ALT、CTRL和R键的虚拟键值} 
    MOD_ALT = 1; 
    MOD_CONTROL = 2; 
    VK_R = 82; 
    begin 
    {首先判断程序是否已经运行} 
    if GlobalFindAtom(’MyHotkey’) = 0 then 
    begin 
    {注册全局热键Ctrl + Alt + R} 
    id:=GlobalAddAtom(’MyHotkey’); 
    RegisterHotKey(handle,id,MOD_CONTROL+MOD_Alt,VK_R); 
    end 
    else 
    halt; 
    end; procedure TForm1.Button2Click(Sender: TObject); 
    begin 
    close; 
    end; 
    {退出时释放全局热键} 
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); 
    begin 
    UnRegisterHotKey(handle,id); 
    GlobalDeleteAtom(id); 
    end; 
    end. ***在捕获热键消息中写你要的东西***
      

  2.   

    /////给你个全局热健类,使用很简单,create以后add就可以了!
    unit HotKey_San;interface
    uses
    windows,sysutils,classes,messages,controls;type
    //TOnHotKeyEvent =procedure of object;
    THotKeyRec=class
    public
      GStr:string;
      ID:integer;
      ////////////
      Succeed:boolean;
      Enabled:boolean;
      ////////////
      Modifiers:Cardinal;
      Key:Cardinal;
      ////////////
      Sync:boolean;
      Handled:boolean;
      ////////////
      ExtData:pointer;
      ExtFigure:real;
      ////////////
      OnHotKey:TNotifyEvent;
      ////////////
      constructor Create(AModifiers,AKey:Cardinal;AHandleProc:TNotifyEvent);
    end;
    ////////////////////////////////////////////////////////////////
    THotKey_San=class(TWinControl)
    private
    protected  List:TList;
      /////////////////  function UnRegisterAHotKey(HKRec:THotKeyRec):boolean;
      function RegisterAHotKey(HKRec:THotKeyRec;AEnable:boolean=true):boolean;
      function FindItem(AModifiers,AKey:Cardinal):THotKeyRec;
      /////////////////
      procedure OnGetHotKey(var msg:tmessage);message wm_hotkey;
    public  ///////////////
      procedure SetEnabled(AEnabled:boolean);
      function GetHotKeyCount:integer;
      procedure DeleteAll;
      function GetHotKeyHandleProc(AModifiers,AKey:Cardinal):TNotifyEvent;
      function AddHotKey(AModifiers,AKey:Cardinal;AHandleProc:TNotifyEvent;AEnable:boolean=true):THotKeyRec;
      procedure DeleteHotKey(AModifiers,AKey:Cardinal);
      procedure EnableHotKey(AModifiers,AKey:Cardinal);
      procedure DisableHotKey(AModifiers,AKey:Cardinal);
      //////////
      constructor Create(AWinControl: TWinControl);
      destructor Destroy;override;end;implementation{ THotKey_San }
                                           
    function THotKey_San.AddHotKey(AModifiers, AKey: Cardinal;AHandleProc:TNotifyEvent;AEnable:boolean=true): THotKeyRec;
    var
    t:thotkeyrec;
    begin
      t:=thotkeyrec.Create(amodifiers,akey,Ahandleproc);
      if not registerahotkey(t) then
      begin
        t.Free;
        t:=nil;
      end
      else
        list.Add(t);
      /////////////
      result:=t;
    end;constructor THotKey_San.Create(AWinControl:TWinControl);
    begin
      inherited create(awincontrol);
      self.Parent:=awincontrol;
      self.Visible:=false;
      list:=tlist.Create;
    end;
    procedure THotKey_San.DeleteAll;
    var
    t:thotkeyrec;
    begin
      while list.Count>0 do
      begin
        t:=thotkeyrec(list.Items[0]);
        unregisterahotkey(t);
        t.Free;
        list.Delete(0);
      end;
    end;procedure THotKey_San.DeleteHotKey(AModifiers, AKey: Cardinal);
    var
    t:thotkeyrec;
    begin
      t:=finditem(amodifiers,akey);
      if t<>nil then
      begin
        unregisterahotkey(t);
        list.Delete(list.IndexOf(t));
        t.Free;
        t:=nil;
      end;  
    end;destructor THotKey_San.Destroy;
    var
    t:thotkeyrec;
    i:integer;
    begin
    //  beep;
      for i:=0 to list.Count-1 do
      begin
        t:=thotkeyrec(list.Items[i]);
        unregisterahotkey(t);
        t.Free;
      end;
      list.Free;
      inherited;
    end;procedure THotKey_San.DisableHotKey(AModifiers,AKey:Cardinal);
    var
    t:thotkeyrec;
    begin
      t:=finditem(amodifiers,akey);
      if t<>nil then
        t.Enabled:=false;
    end;procedure THotKey_San.EnableHotKey(AModifiers,AKey:Cardinal);
    var
    t:thotkeyrec;
    begin
      t:=finditem(amodifiers,akey);
      if t<>nil then
        t.Enabled:=true;
    end;function THotKey_San.FindItem(AModifiers, AKey: Cardinal): THotKeyRec;
    var
    i:integer;
    t:thotkeyrec;
    begin
      result:=nil;
      for i:=0 to list.Count-1 do
      begin
        t:=thotkeyrec(list.Items[i]);
        if (t.Modifiers=amodifiers) and(t.Key=akey) then
        begin
          result:=t;
          exit;
        end;
      end;
    end;function THotKey_San.GetHotKeyCount: integer;
    begin
      result:=list.Count;
    end;function THotKey_San.GetHotKeyHandleProc(AModifiers, AKey: Cardinal): TNotifyEvent;
    var
    t:thotkeyrec;
    begin
      result:=nil;
      t:=finditem(amodifiers,akey) ;
      if t<>nil then
        result:=t.onhotkey;
    end;procedure THotKey_San.OnGetHotKey(var msg:tmessage);
    var
    t:thotkeyrec;
    setted:boolean;
    begin
    //setted:=false;
      if not self.Enabled then exit;
     
      t:=finditem(msg.LParamLo,msg.LParamHi);
     // if t=nil then beep;
      if (t<>nil)and(t.Succeed)and(t.Enabled) then
      begin
        setted:=t.Sync;
        if setted then t.Enabled:=false;
        t.onhotkey(t);
        if t.Handled then msg.Result:=1;
        if setted then t.Enabled:=true;  end;  end;function THotKey_San.RegisterAHotKey(HKRec:THotKeyRec;AEnable:boolean=true): boolean;
    var
    i:cardinal;
    begin
      result:=false;
      //////////  i:=list.Count;  hkrec.gstr:=classname+':'+hkrec.ClassName+'_'+inttostr(i);
      while GlobalFindAtom(pchar(hkrec.gstr))<>0 do
      begin
        hkrec.gstr:=ClassName+':'+hkrec.ClassName+'_'+inttostr(i);
        inc(i);
      end;
      //////////
      hkrec.id:=GlobalAddAtom(pchar(hkrec.gstr));
      result:=registerhotkey(handle,hkrec.id,hkrec.modifiers,hkrec.key);
      hkrec.succeed:=result;
      hkrec.Enabled:=aenable;
    end;procedure THotKey_San.SetEnabled(AEnabled: boolean);
    begin
      enabled:=aenabled;
    end;function THotKey_San.UnRegisterAHotKey(HKRec:THotKeyRec): boolean;
    begin
       result:=UnRegisterHotKey(handle,hkrec.id) and (GlobalDeleteAtom(hkrec.id)=0);
    end;{ THotKeyRec }constructor THotKeyRec.Create(AModifiers,AKey:Cardinal;AHandleProc:TNotifyEvent);
    begin
      self.ID:=0;
      self.Enabled:=false;
      self.Succeed:=false;
      self.GStr:='';
      self.Modifiers:=amodifiers;
      self.Key:=akey;
      self.onhotkey:=ahandleproc;
      ////////////
      handled:=false;
      extdata:=nil;
      extfigure:=0;
      ///////////
      self.Sync:=true;
    end;end.
      

  3.   

    function THotKey_San.AddHotKey(AModifiers, AKey: Cardinal;AHandleProc:TNotifyEvent;AEnable:boolean=true): THotKeyRec;
    里面AHandleProc就接受热健消息以后的处理函数,TNotifyEvent类型的。
    参数sender是THotKeyREc类型的。
    单元前面有定义。如果需要,你可以得到是哪个热健被按了。
    不过一般没必要,因为addhotkey的时候已经挂好了相应热间的处理函数!