//***************************************************** 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. 或者是 {用到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);