MFC-全局热键
为基于对话框的应用程序增加全局热键其实没有多困难,只不过需要手工操作的东西相比来说稍微多一些而已。
1、在OnInitDialog中注册热键
使用函数RegisterHotKey()可以向系统注册全局热键,如下:
RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_SHIFT,'y');
RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_SHIFT,'Y');
上面的代码向系统注册了Ctrl+Shift+Y的热键,对应的热键ID为1001和1002
2、在WM_DESTROY消息处理函数中卸载热键
首先为对话框增加WM_DESTROY消息的处理函数。右键窗体,选择“Events...”:
在左侧的messages/events列表中,找到WM_DESTROY并选中,然后点击右侧的“Add and Edit”,添加并进入代码编辑状态:
在OnDestroy()函数中添加如下代码:
void CTest_background_windowDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
UnregisterHotKey(m_hWnd, 1001);
UnregisterHotKey(m_hWnd, 1002);
}
利用UnregisterHotKey()函数注销之前注册的热键。
3、为对话框增加WM_HOTKEY消息处理函数
为了可以让对话框响应全局热键,需要增加对WM_HOTKEY消息的处理函数。由于在对话框的Events中无法直接找到WM_HOTKEY消息,所以需要手工添加代码,方法如下:
在对话框的MESSAGE_MAP中增加:
ON_MESSAGE(WM_HOTKEY,OnHotKey)
OnHotKey()的函数原型如下:
LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
在对话框类中增加protected消息成员函数:
afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
在对话框类的实现cpp文件中增加该函数的实现体:
LRESULT CTest_background_windowDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
if (wParam== 1001||wParam==1002)
{
CWnd::SetForegroundWindow();//使得被激活窗口出现在前景
//用户可在此添加代码
}
return 0;
}
在该函数中,主要是判断wParam是否与之前注册过的热键相同,并做出相应处理。在本例中,程序使用了CWnd::SetForegroundWindow()函数将自身至于最前,以达到按下热键之后呼唤出应用程序窗体的效果。