`
huobengle
  • 浏览: 860497 次
文章分类
社区版块
存档分类
最新评论

11.12响应组合键与全局热键

 
阅读更多
①、利用 GetKeyState 函数获得某一按键的按下、弹起状态;


//用 PreTranslateMessage 的方法,判断 Ctrl+Q 是否同时按下:


②、通过载入快捷键资源,并建立快捷键与消息映射的方法来实现:
1> 添加快捷键资源;
2> 修改快捷键资源中的组合键配置;
3> 添加响应函数声明,格式为:afx_msg void OnCtrlW();
4> 添加消息映射,格式为:ON_BN_CLICKED(ID_ACC_1, OnCtrlW) 或者 ON_BN_CLICKED(ID_ACC_1, &CMFCTestDlg::OnCtrlW)
5> 添加响应函数的实现:
void CMFCTestDlg::OnCtrlW()
{
MessageBox(_T("您按下了 Ctrl+W 键!"));
}
6> 初始化快捷键资源;//添加到初始化函数中
hAcc = LoadAccelerators(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));

7> 在 PreTranslateMessage 函数中进行拦截处理:


③、两种方法的比较:
第一种方法比较直接,使用方便,但一般只应用于快捷键比较少的程序;
第二种方法比较实用,虽然实现起来代码量稍微大一些,但是适用于快捷键比较多的程序中;

④、弊端:只在程序为当前活动窗口的时候有效,最小化、非活动窗口时无效!
解决方法:注册全局系统热键

①、注册全局系统热键的优点:
即使程序的窗口不是当前活动窗口、或者窗口最小化、隐藏后,也都可以响应热键;
比如QQ软件的默认呼出热键:Ctrl+Alt+Z 就是注册了全局系统热键;

②、注册窗口全局系统热键的步骤:

1> 调用 RegisterHotKey 函数注册全局系统热键;
BOOL RegisterHotKey(
HWND hWnd,
int id,
UINT fsModifiers,
UINT vk
);
hWnd : 指定响应该热键的窗口句柄;
id : 热键的标识,有点类似于 SetTimer 中的标识,作用域为线程内;
fsModifiers : 指定组合键,这个值可以由 MOD_ALT、MOD_CONTROL、MOD_SHIFT、MOD_WIN 中的一个或几个组成;
vk : 指定热键的虚拟键盘码,如:'A'
备注:这里的 Ctrl+Alt+A 这个组合键的作用域是全局的;

示例:RegisterHotKey(m_hWnd, 1000, MOD_CONTROL|MOD_ALT, 'Q');

2> 响应目标窗口的 WM_HOTKEY 消息;//也可以重写对话框的PreTranslateMessage函数 WM_HOTKEY
3> 调用 UnregisterHotKey 卸载热键:
BOOL UnregisterHotKey(
HWND hWnd,
int id
);
hWnd : 热键关联的窗口句柄;
id : 热键的标识;
可以放到对话框类的 OnDestroy() 函数中进行调用,这样模态与非模态对话框都可以成功的进行卸载;

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics