VC如何注册、屏蔽全局键盘热键
1、定义按键消息热键的宏,后续可自行添加更多
/************************************************************************/
// VirtualKey.H By:Koma 2009.08.22
// 定义热键
// http://blog.csdn.net/wangningyu
/************************************************************************/
/* Ctrl组合键 (D、F2、F8、F9、F10、F11、F12 共6个)
/************************************************************************/
#define IDH_HOT1 4001
#define IDH_HOT2 4002
#define IDH_HOT3 4003
#define IDH_HOT4 4004
#define IDH_HOT5 4005
#define IDH_HOT6 4006
#define IDH_HOT19 4019
/************************************************************************/
/* Alt组合键 (F1、F4、F9 共3个)
/************************************************************************/
#define IDH_HOT7 4007
#define IDH_HOT8 4008
#define IDH_HOT9 4009
/************************************************************************/
2、注册全局的热键,从而实现屏蔽热键
/************************************************************************/
/* 函数说明:MFC初始化函数,用来注册全局热键
/* 参 数:无
/* 返 回 值:成功返回TRUE、失败返回FALSE
/* By:Koma 2009.07.30 17:50
/************************************************************************/
BOOL CHookKBDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 如果需要添加其他的组合键,需要在VirtualKey.h添加记录
// 在OnInitDialog、PreTranslateMessage中各添加一行代码即可
// Ctrl组合键 (D、F2、F8、F9、F10、F11、F12 共7个)
RegisterHotKey(this->GetSafeHwnd(),IDH_HOT1, MOD_CONTROL, VK_F2);
RegisterHotKey(this->GetSafeHwnd(),IDH_HOT2, MOD_CONTROL, VK_F8);
RegisterHotKey(this->GetSafeHwnd(),IDH_HOT3, MOD_CONTROL, VK_F9);
RegisterHotKey(this->GetSafeHwnd(),IDH_HOT4, MOD_CONTROL, VK_F10);
RegisterHotKey(this->GetSafeHwnd(),IDH_HOT5, MOD_CONTROL, VK_F11);
RegisterHotKey(this->GetSafeHwnd(),IDH_HOT6, MOD_CONTROL, VK_F12);
RegisterHotKey(this->GetSafeHwnd(),IDH_HOT19, MOD_CONTROL, 'D');
// Alt组合键 (F1、F4、F9 共3个)
RegisterHotKey(this->GetSafeHwnd(),IDH_HOT7, MOD_ALT, VK_F1);
RegisterHotKey(this->GetSafeHwnd(),IDH_HOT8, MOD_ALT, VK_F4);
RegisterHotKey(this->GetSafeHwnd(),IDH_HOT9, MOD_ALT, VK_F9);
return TRUE; // return TRUE unless you set the focus to a control
}
3、有点像"占着茅坑不拉S”,直接过滤掉此消息...
/************************************************************************/
/* 函数说明:MFC虚函数,用来屏蔽热键
/* 参 数:无
/* 返 回 值:屏蔽返回TRUE、不屏蔽返回FALSE
/* By:Koma 2009.07.30 17:50
/************************************************************************/
BOOL CHookKBDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message==WM_HOTKEY)
{
switch(pMsg->wParam)
{
case IDH_HOT1:
case IDH_HOT2:
case IDH_HOT3:
case IDH_HOT4:
case IDH_HOT5:
case IDH_HOT6:
case IDH_HOT7:
case IDH_HOT8:
case IDH_HOT9:
// MessageBox(_T("此类组合键严禁使用!"));
// true 标示处理过此消息不再投递到消息队列,
SetDlgItemText(IDC_STATIC1,"别按了,没用的!");
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
注意: 取消注册热键用 UnregisterHotKey(......)
------------------------------------------
MFC 热键设置 OnHotKey方法和Accelerator方法的设置
在写MFC程序时,如果想自定义热键比如ALT+S可以采用下面两种方法:
方法一:定义热键的消息响应函数:OnHotKey
定义系统全局热键:
1、首先在.h文件中添加消息响应函数声明
afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
2、关联消息及响应函数
BEGIN_MESSAGE_MAP()
ON_MESSAGE(WM_HOTKEY,OnHotKey)
END_MESSAGE_MAP()
3、在初始化函数里注册热键
RegisterHotKey(m_hWnd,ID_HOTKEY,MOD_ALT,‘s’);
// ID_HOTKEY是自己定义的一个ID宏
‘s'可以写成ASCII码
4、在消息响应函数里添加操作
LRESULT CMyTest::OnHotKey(WPARAM wParam,LPARAM lParam)
{
UINT Mod = (UINT) LOWORD(lParam); // key-modifier flags
UINT uVirtKey = (UINT) HIWORD(lParam); // virtual-key code
//判断响应了什么热键
if( MOD_CONTROL == Mod && ‘s’ == uVirtKey )
{
AfxMessageBox(_T("你按下了组合键 ALT+ S"));
}
else
AfxMessageBox(_T("你按下了未知热键"));
return 0;
}
Accelerator方法 只在本应用程序内有效
http://support.microsoft.com/?kbid=222829
1、插入一个新的Accelerator到资源里,把加速键和对应的响应控件(如一个按钮)关联
2、在对话框头文件中声明:
HACCEL m_hAccel;
3、在对话框的构造函数里初始化m_hAccel
m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));
4、然后重载对话框的PreTranslateMessage函数,在
BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg)
{
if (m_hAccel)
{
if (::TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
{
return(TRUE);
}
}
return CDialog::PreTranslateMessage(pMsg);
}
http://support.microsoft.com/?kbid=222829
1、插入一个新的Accelerator到资源里,把加速键和对应的响应控件(如一个按钮)关联
2、在对话框头文件中声明:
HACCEL m_hAccel;
3、在对话框的构造函数里初始化m_hAccel
m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));
4、然后重载对话框的PreTranslateMessage函数,在
BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg)
{
if (m_hAccel)
{
if (::TranslateAccelerator(m_hWnd, m_hAccel, pMsg))
{
return(TRUE);
}
}
return CDialog::PreTranslateMessage(pMsg);
}
然后重载 OnCommand();函数;
BOOL CFreeChatDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (ID_ALT_S == LOWORD(wParam))//ID_ALT_S是在 Accelerator中注册快捷键的ID
{
//加入响应的快捷键的操作
}
return CDialog::OnCommand(wParam,lParam);
}
希望能帮你少走点弯路^^
注意: 取消注册热键用 UnregisterHotKey(......)