delphi 设置系统级的组合键

1.全局或者局部的组合快捷键

如果是全局和局部的,那么用主窗体上(或其他控件上)(form)的KeyPress等属性进行监控。

2. 如果是系统级的,那么需要API了.

 

1>BOOL RegisterHotKey(HWND hWnd, Int id, UINT fsModifiers, UINT vk  );

HWND   //响应该热键的窗口句柄

Int       //该热键的唯一标识

UINT    //该热键的辅助按键

UINT     //该热键的键值

热键的辅助按键包括Mod_Ctrl 、Mod_Alt、Mod_Shift,对于Windows兼容键盘还支

持Windows键,即其键面上有Windows标志的那个键,其值为Mod_win。

 

2>为了得到唯一标识,我们还将用到另一个API函数

ATOM GlobalAddAtom( LPCTSTR lpString);

 LPCTSTR lpString //自己设定的一个字符串

 

3>.注销热键, 释放资源。

UnRegisterHotKey(HWND hWnd, Int id); //注销HotKey, 释放资源。

 

3.系统级快捷键设置的步骤:

 

1>.设置全局变量:

      因为我们还要在程序退出的时候,消除这个热键, 所以需要声明一个全局变量:

      HotKeyId: Integer;

 

2>. 在窗口的create事件中,加入以下代码

HotKeyId := GlobalAddAtom('MyHotKey') - $C000;

注意: HotKeyId的合法取之范围是0x0000到0xBFFF之间, GlobalAddAtom函数得到的值在

0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。

RegisterHotKey(Handle, hotkeyid, MOD_ALT, VK_F8); //注册了一个热键:ALT+F8。

注:handle是一个特殊的变量,它表示当前窗口的句柄。只用F8, 就这么写:

RegisterHotKey(Handle, hotkeyid, 0, VK_F8);

 

Windows发送消息的原理:

一旦热键设置成功,在程序应用过程中如果有相应的键被按下,Windows系统都会给你的应用

程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。其中

WM_HOTKEY消息的格式为: 

idHotKey = (int) wParam; // 该参数在设置系统级的热键有用,一般不予使用

fuModifiers = (UINT) LOWORD(lParam);  //热键的辅助按键

uVirtKey = (UINT) HIWORD(lParam); //热键的键值

 

3>.响应代码

声明函数: 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;

 

4>.在窗口的close事件中加入

UnRegisterHotKey(handle, HotKeyId); //注销HotKey, 释放资源。

 

4.相应的代码

private:
procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY;

var
HotKeyId: Integer; 

procedure TMainForm.btn1Click(Sender: TObject);
begin
  HotKeyId := GlobalAddAtom('MyHotKey') - $C000;
  RegisterHotKey(Handle, hotkeyid, 0, VK_F8);
end;

procedure TMainForm.btn2Click(Sender: TObject);
begin
  UnRegisterHotKey(handle, HotKeyId); //注销HotKey, 释放资源。
end;

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;


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值