加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

RegisterHotKey注册热键的具体使用方法

(2016-08-30 17:16:59)
标签:

registerhotkey

globaladdatom

unregisterhotkey

注册热键

分类: 软件开发
使用方法如下:

BOOL RegisterHotKey(
                    HWND  hWnd,         //响应该热键的窗口句柄
                    Int   id,                       //该热键的唯一标识
                    UINT  fsModifiers,   //该热键的辅助按键
                    UINT  vk                 //该热键的键值
                    );  

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

ATOM   GlobalAddAtom(
                     LPCTSTR   lpString   //自己设定的一个字符串
                     );

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

   

第一步:  

在窗口的Create事件中,加入以下代码  

HotKeyId = GlobalAddAtom("MyHotKey") - 0xC000;
注:HotKeyId的合法取之范围是0x0000到0xBFFF之间,而GlobalAddAtom函数得到的值在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。

第二步:  

在上面的代码下面加入:  

RegisterHotKey(Handle,HotKeyId,MOD_ALT,'Q');  //ALT+Q

热键的辅助按键包括Mod_Ctrl、Mod_Alt、Mod_Shift,对于Windows兼容键盘还支持Windows键,即其键面上有Windows标志的那个键,其值为Mod_win。

上面的代码注册了一个热键:ALT+Q。当然如果你希望象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段中加入声明   (作用是声明这个过程,和声明变量类似。
关于如何声明函数、过程,请请参考各自的帮助文件或其它资料):  

void __fastcall HotKeyDown(Messages::TMessage &Msg);   message   WM_HOTKEY;  

然后在程序中加入如下代码:  

void __fastcall TForm1::.HotKeyDown(Messages::TMessage &Msg);  
{
  if(Msg.LParamLo == MOD_ALT && Msg.LParamHi == 'Q')  //假设热键为ALT+Q
  {
     //TODO
     MessageBox(Handle,"HotKey ALT+Q is press down.","Hint info",MB_ICONINFORMATION);
  }
}

也可以直接重载窗口消息处理函数 WndProc(TMessage &Message)
void __fastcall TForm1::WndProc(Messages::TMessage &Message)
{
  if(Message.Msg == WM_HOTKEY)
  {
    if(Message.WParam == HotKeyId)
    {
      //TODO
      MessageBox(Handle,"HotKey ALT+Q is press down.","Hint Info",MB_ICONINFORMATION);
    }
  }
 
  TForm::WndProc(Message);
}

最后一步:  

在窗口的Close事件中加入  

UnregisterHotKey(Handle,HotKeyId);   //注销HotKey,释放资源

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有