当前位置:C++技术网 > 精选软件 > Win32系统热键原理和win32实现系统级的热键

Win32系统热键原理和win32实现系统级的热键

更新时间:2016-11-08 10:29:01浏览次数:1+次

   系统热键就是系统全局的快捷键组合。即使你的窗口不是当前激活窗口,比如隐藏了、最小化了,都可以接受到系统热键消息WM_HOTKEY。我们即使没有显示QQ的主界面,按下热键,就可以启动QQ截图。

    下面一张图是系统热键的原理流程图:

Win32系统热键原理和win32实现系统级的热键

   系统热键有一个队列,系统全局的。所有的窗口都可以注册系统热键。但是热键ID在队列中要唯一。而要想窗口获得系统热键支持,需要先注册一下。注册实际上就是将你需要的热键组合添加到这个热键队列中。

    当系统检测到键盘组合按下的时候,会去系统热键队列查找组合,找到之后,就会通过注册的窗口句柄,将WM_HOTKEY消息发送给对应的窗口,就通知到了窗口。窗口处理WM_HOTKEY消息就可以响应热键了。窗口不需要做额外的键盘消息和键盘信息的判断,直接处理WM_HOTKEY消息就行了。WM_HOTKEY消息。当然,如果你注册了多个热键,你可以通过判断WM_HOTKEY的WPARAM参数即热键ID来区分。最后一个参数就是键码virtual-key code,这是一个可选项,用于判断组合按下的是Ctrl键、Shift键、Alt键还是Win键。取值为MOD_ALT、MOD_CONTROL、MOD_SHIFT、MOD_WIN。

    我们使用RegisterHotKey函数注册热键,第一个参数为窗口句柄、第二个热键ID,如果怕热键ID和其他窗口定义的冲突而失败,即RegisterHotKey返回0,可以使用GlobalAddAtom函数获取热键ID。但是GlobalAddAtom不是必须的。第三个参数是控制键MOD_ALT、MOD_CONTROL、MOD_SHIFT、MOD_WIN的一个。第四个为一般的按键,字母按键直接使用字符编码即可,如果不知道字符编码,直接使用字符就行了,如'E'。

    下面是注册热键的代码段:

//全局变量
static int hotkeyidE;
static int hotkeyidA;

//窗口创建的时候注册
hotkeyidE = GlobalAddAtom(_T("myhotkeyE"));
hotkeyidA = GlobalAddAtom(_T("myhotkeyA"));
if(RegisterHotKey(hWnd,hotkeyidE,MOD_CONTROL,'E'))
{
    MessageBox(hWnd,_T("热键Ctrl+E注册成功"),_T("热键注册"),0);
}
if(RegisterHotKey(hWnd,hotkeyidA,MOD_CONTROL,'A'))
{
    MessageBox(hWnd,_T("热键Ctrl+A注册成功"),_T("热键注册"),0);
}
   然后在窗口过程的WM_HOTKEY消息的处理代码:


case WM_HOTKEY:
    if(wParam==hotkeyidE)
    {
        MessageBox(hWnd,_T("Ctrl+E热键被按下"),_T("热键按下"),0);
    }
    else if(wParam==hotkeyidA)
    {
            MessageBox(hWnd,_T("Ctrl+A热键被按下"),_T("热键按下"),0);
    }
    break;
   整个流程就实现了。