如题,网上找的都有问题,用不了~~~(我的是Delphi 7版本,最好有注释的)

解决方案 »

  1.   


    unit Unit1;   
      
    interface  
      
    uses  
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   
      Dialogs, StdCtrls, CoolTrayIcon;   
      
    type  
      TForm1 = class(TForm)   
        btn1: TButton;   
        procedure FormCreate(Sender: TObject);   
        procedure FormDestroy(Sender: TObject);   
      private  
        { Private declarations }  
        procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;   
      public  
      
        HotKeyId:  Integer;   
        { Public declarations }  
      end;   
      
    var  
      Form1: TForm1;   
      
    implementation  
      
    {$R *.dfm}  
      
    procedure TForm1.WMHotKey(var Msg: TWMHotKey);   
    begin  
      if Msg.HotKey = HotKeyId then  
      begin  
         ShowWindow(Application.Handle, SW_RESTORE);   
         SetForegroundWindow(Application.Handle);   
      end;   
      
    end;   
      
    procedure TForm1.FormCreate(Sender: TObject);   
    begin  
       HotKeyId := GlobalAddAtom(PChar('F2'));   
       RegisterHotKey(Handle,HotKeyId,0,VK_F2);   
    end;   
      
    procedure TForm1.FormDestroy(Sender: TObject);   
    begin  
       UnRegisterHotKey(handle,HotKeyId);   
       GlobalDeleteAtom(HotKeyId);   
      
    end;   
      
    end.  
    {OR}
    {用到3个API函数:}  
    BOOL RegisterHotKey(    
    HWND hWnd, //响应该热键的窗口句柄    
    Int id, //该热键的唯一标识    
    UINT fsModifiers, //该热键的辅助按键    
    UINT vk //该热键的键值    
    );    
    {  
    为了得到唯一标识,我们还将用到另一个API函数}    
      
    ATOM GlobalAddAtom(    
      
    LPCTSTR lpString //自己设定的一个字符串    
      
    );    
    {  
    因为我们还要在程序退出的时候,消除这个热键, 所以需要声明一个全局变量:}    
      
    HotKeyId: Integer;    
    {  
    第一步:   
     
    在窗口的create事件中,加入以下代码   
    }  
    HotKeyId := GlobalAddAtom('MyHotKey') - $C000;    
    {注: HotKeyId的合法取之范围是0x0000到0xBFFF之间, GlobalAddAtom函数得到的值在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。   
     
    第二步:   
     
    在上面的代码下面加入:   
    }  
    RegisterHotKey(Handle, hotkeyid, MOD_ALT, VK_F8);    
    {  
    热键的辅助按键包括Mod_Ctrl 、Mod_Alt、Mod_Shift,对于Windows兼容键盘还支持Windows   
    键,即其键面上有Windows标志的那个键,其值为Mod_win。   
     
    上面 的代码注册了一个热键:ALT+F8。当然如果你希望象TAKEIT那样,只用F8, 就这么写:}    
      
    RegisterHotKey(Handle, hotkeyid, 0, VK_F8);    
    {  
    注:handle是一个特殊的变量,它表示当前窗口的句柄。   
     
    这个函数你应该能句举一反三了吧。   
     
    原理:   
     
    一旦热键设置成功,在程序应用过程中如果有相应的键被按下,Windows系统都会给你的应   
    用程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。其中WM_HOTKEY消   
    息的格式为:   
    }  
    idHotKey = (int) wParam; // 该参数在设置系统级的热键有用,一般不予使用    
    fuModifiers = (UINT) LOWORD(lParam); //热键的辅助按键    
    uVirtKey = (UINT) HIWORD(lParam); //热键的键值    
    {  
    第三步:   
     
    响应代码  
     
    首先,在程序头部分的private段中加入声明 (作用是声明这个过程,和声明变量类似。   
    关于如何声明函数、过程,请请参考各自的帮助文件或其它资料):   
    }  
    procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY;    
    {  
    然后在程序中加入如下代码:   
    }  
    procedure Tfmain.HotKeyDown(var Msg: Tmessage);    
    begin    
    if (Msg.LparamLo = MOD_ALT) AND (Msg.LParamHi = VK_F8 then) // 假设热键为ALT+F8    
    begin    
    ShowMessage('F8');    
    end;    
    end;    
    {  
    最后一步:   
     
    在窗口的close事件中加入   
    }  
    UnRegisterHotKey(handle, HotKeyId); //注销HotKey, 释放资源。   
      
      
    atomid = GlobalAddAtom(ls_atomid)    
    //得到ID,保证不和其他应用程序发生冲突    
    ll_RC = RegisterHotKey(Handle(this), atomid, MOD_ALT + MOD_CONTROL, 65)    
    //注册的热键为Ctrl+Alt+A ,65为'A'   
    {  
    声明函数和类型  
    }  
    private  
        hotkeyid :integer;   
         procedure WMhotkeyhandle(var msg:Tmessage); message wm_hotkey; //最小化或者隐藏程序响应热键   
    {  
    注册热键  
    }  
    hotkeyid:=GlobalAddAtom(pchar('UserDefineHotKey'))-$C000; //取值范围   
    registerhotkey(handle,hotkeyid,mod_Alt,90);//注册热键   
      
     if (msg.LParamHi=90) and(msg.lparamLo=mod_Alt) then //相应代码   
     form1.Show;/显示窗体   
      
    //注销热键   
      
    unregisterhotkey(handle,hotkeyid);    
    DeleteAtom(HotKeyID);  
      

  2.   

    http://blog.csdn.net/wh445306/archive/2007/12/18/1950757.aspx
    这个很简单,应该没问题
      

  3.   

    http://blog.csdn.net/liangpei2008/archive/2009/04/25/4123217.aspx
      

  4.   

    这有个起作用的,但是不能实现程序启动就自动注册热键,要按按钮手动注册,不知道是哪里出了问题?type
    TForm1 = class(TForm)
        Label1: TLabel;
        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('hotkey');               //全局热键ID
    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    //全局热键 ALT+F12
              ShowWindow(Application.Handle, SW_RESTORE); //当目标窗口没有最小化而是层叠在后台时无效,只能用于显示隐藏或最小化的窗体
              SetForegroundWindow(form1.handle);    //当目标窗体最小化后此句无效,只能改变窗体z序列前后位置      end;
                                                     //note:以上两个API合用时才能达到随时激活隐藏窗体的效果procedure TForm1.FormDestroy(Sender: TObject);          //销毁全局热键
    begin
    globalDeleteatom(aatom);
    end;
      

  5.   

    发错了,不是上面那个,是:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      protected
      procedure hotykey(var msg:TMessage); message WM_HOTKEY;
      private
      //procedure WndProc(var Message: TMessage); override;
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      hotkey_F1: integer;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      hotkey_F1 :=GlobalAddAtom('hotkey1');
      RegisterHotKey(handle, HotKey_F1, 0, vk_F1); //F1
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      hotkey_F1 :=GlobalAddAtom('hotkey1');
      RegisterHotKey(handle, HotKey_F1, 0, vk_F1); //F1
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      hotkey_F1 :=GlobalAddAtom('hotkey1');
      RegisterHotKey(handle, HotKey_F1, 0, vk_F1); //F1
    end;procedure TForm1.hotykey(var msg:TMessage); 
    begin 
    if (msg.LParamHi=vk_F1) then showmessage('Ctrl + Q ');
    end; {
    procedure TForm1.WndProc(var Message: TMessage);
    begin
      Inherited;
      if Message.LParamHi=vk_F1 then showmessage('F1被按下');
    end;        }procedure TForm1.FormDestroy(Sender: TObject);
    begin
      UnRegisterHotKey(handle, HotKey_F1);      //F1
    end;
    end.