Delphi 热键

注册热键后,不论程序是否在前台,都能接收到 WM_HOTKEY 消息。

注:注册的热键在修改窗口的 BorderStyle 属性后导致失效,将顺序颠倒问题解决。

MyHotKeyID : integer;
MyHotKeyID := GlobalAddAtom('SoundHotKey')-$C000;
function RegisterHotKey(handle, MyHotKeyID, Mod, vk):boolean;
function UnRegisterHotKey(handle, MyHotKeyID):boolean;
参数 意义
handle 接收消息的窗体
MyHotKeyID 热键 ID
Mod 功能键:

MOD_SHIFT, MOD_ALT, MOD_CONTROL, MOD_WIN

vk 按键:

VK_F1, VK_F2

GlobalAddAtom 生成 $C000-$FFFF 的 ID(DLL 用),应用程序只能用 $0000-$BFFF
RegisterHotKey 注册热键,返回值表示是否成功
UnRegisterHotKey 注销热键

消息处理

procedure user_hotkey(var msg:TMessage); message WM_HOTKEY;
msg 属性 意义
Msg WM_HOTKEY
WParam 热键 ID
IDHOT_SNAPDESKTOP
IDHOT_SNAPWINDOW
LParamLo 功能键
LParamHi 按键

示例:

// 定义热键 ID 及热键注册是否成功的变量
Var
   MyHotKeyID : integer;
   MyHotKeyOK : boolean;
// 在窗口构造函数中注册热键
procedure TForm1.FormCreate(Sender: TObject);
begin
   MyHotKeyID := GlobalAddAtom('HotKeyNameString')-$C000;
   MyHotKeyOK := RegisterHotKey(handle, MyHotKeyID, MOD_ALT, VK_F8);
end;
// 在窗口销毁时注销热键
procedure TForm1.FormDestroy(Sender: TObject);
begin
   if MyHotKeyOK then
      UnRegisterHotKey(handle,MyHotKeyID);
end;
// 热键消息的处理过程
procedure TForm1.proc_hotkey(var msg:TMessage); message WM_HOTKEY;
begin
   if msg.WParam = MyHotKeyID then
   begin
      // 按热键 ALT-F8 后执行的操作
   end;
end;