Windows编程实现自定义全局热键

56 篇文章 5 订阅

一、实现全局热键主要使用以下API(详情查看MSDN):

- 获取热键标识:GlobalAddAtom
- 注册热键:RegisterHotKey
- 注销热键:UnregisterHotKey
- 释放热键标识:GlobalDeleteAtom

 
 
  • 1
  • 2
  • 3
  • 4
  • 5

二、热键注册/注销步骤

1、ATOM hotKeyId = GlobalAddAtom( _T("myHotKeyId") ) - 0xc000;
// 拿到一个唯一的热键标识 hotKeyId

2、RegisterHotKey(hwnd, hotKeyId, MOD_XXX, VK_XXX);
// 注册全局热键
// hwnd:本程序窗口句柄
// hotKeyId:第1步中获得的热键标识
// MOD_XXX:组合键的标识,例如Ctrl键为:MOD_CONTROL, Shift键为:MOD_SHIFT
// VK_XXX:键盘按键标识,例如F1键为:VK_F1, A键为'A'

3、UnregisterHotKey(hwnd, hotKeyId);
// 注销全局热键
// hwnd:本程序窗口句柄
// hotKeyId:第1步中获得的热键标识

4、GlobalDeleteAtom(hotKeyId);
// 释放掉热键标识 hotKeyId

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

三、成功注册后的热键使用方法

在Windows程序的消息处理函数中处理WM_HOTKEY消息
// 例如在DUILIB的窗体程序里代码如下:

 
 
  • 1
  • 2
  • 3
void MainFrame::RegisterHotKey() {

    m_HotKeyId1 = GlobalAddAtomW( _T("HotKey1") ) - 0xc000;
    m_HotKeyId2 = GlobalAddAtomW( _T("HotKey2") ) - 0xc000;
    m_HotKeyId3 = GlobalAddAtomW( _T("HotKey3") ) - 0xc000;

    return;
}

LRESULT MainFrame::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) {

    LRESULT lRes = 0;
    BOOL bHandled = TRUE;

    switch( uMsg ) {
    ...
    case WM_HOTKEY:
        lRes = OnHotKey(wParam, lParam);
        break;
    ...
    }

    return lRes;
}

LRESULT MainFrame::OnHotKey(WPARAM wParam,LPARAM lParam) { 

    LRESULT lRes = 0;

    if ( wParam == m_HotKeyId1 ) {
        // 该热键按下时的处理
    }
    else if ( wParam == m_HotKeyId2 ) {
        // 该热键按下时的处理
    }
    else if ( wParam == m_HotKeyId3 ) {
        // 该热键按下时的处理
    }
    ...

    return lRes;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

四、注意事项

1、当不需要使用热键功能时,例如程序退出,需要注销热键以及释放热键标识。
2、如果需要同时使用多个不同的热键,需要获取多个热键标识,并注册多次,GlobalAddAtom()中的参数自行填写,不要重复。
3、如果程序运行,热键未能生效,可用GetLastError()查看错误码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值