热键注册与注销两个API函数:1.RegisterHotKey(注册热键)
2.UnregisterHotKey(反注册热键)
一、注册RegisterHotKey
1.函数原型如下
BOOL RegisterHotKey(
HWND hWnd, // handle to window
int id, // hot key identifier
UINT fsModifiers, // key-modifier options
UINT vk // virtual-key code
);
说明:
第一个参数指定接收WM_HOTKEY消息的窗体句柄
第二个参数热键标识,代表这个热键的唯一ID,应用程序中的标识值在0x0000和0xbfff之间,DLL中的在0xc000和0xffff之间第三个参数 指的是附加按键的修改,比如说你按住了CTRL键,这里的值可以选择MOD_ALT,MOD_CONTROL,MOD_SHIFT,MOD_WIN,MOD_KEYUP第四个参数指的是按键的虚拟码 (比如,F7的是118)
二、UnregisterHotKey
1.函数原型如下
BOOL UnregisterHotKey(
HWND hWnd, // handle to window
int id // hot key identifier);
说明:
第一个参数是说明你要注销哪个窗口句柄的热键第二个参数说明是你开始注册的唯一ID
三、使用RegisterHotKey
1. RegisterHotKey可以向窗口发送WM_HOTKEY消息,所以先定义WM_HOTKEY消息映射。
在.h文件中加入:
afx_msg voidOnHotKey(WPARAM wParam,LPARAM lParam);//手动加入
在.cpp文件中加入:
ON_MESSAGE(WM_HOTKEY,OnHotKey)
2.登记热键
BOOL CMyDlg::RegisterHotKey()
{
WPARAM m_wVirtualKeyCode = 118;//即F7的虚拟码
LPARAM m_wModifiers =0;
UINT fsModifiers = 0;
if (m_wModifiers & HOTKEYF_ALT)
{
fsModifiers |= MOD_ALT;//加上ALT键
}
if (m_wModifiers & HOTKEYF_CONTROL)
{
fsModifiers |= MOD_CONTROL;
}
if (m_wModifiers & HOTKEYF_SHIFT)
{
fsModifiers |= MOD_SHIFT;
}
//int ret = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D');
//HOTKEYID 为自定义的 #define HOTKEYID 0x2FED
if(!::RegisterHotKey(GetSafeHwnd(),HOTKEYID, fsModifiers, m_wVirtualKeyCode)) //第四个参数可以直接写“F7”,如上
{
MessageBox( "注册系统热键失败! ");
return FALSE;
}
return TRUE;
}
3.热键响应函数
void CMyDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
///////////////////////////////////////你的操作
}
四、使用UnregisterHotKey
void ****::OnDestroy()
{
//Unregister热键
#ifdef _DEBUG
int nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);
if(!nRet)
AfxMessageBox(_T("UnregisterHotKey 0 false"));
nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);
if(!nRet)
AfxMessageBox(_T("UnregisterHotKey 1 false"));
#else
UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]);
UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]);
#endif
}
五、(使用代码发送)发送组合键消息
1)发送WM_HOTKEY消息
- LPARAM lParam;
- //发送WM_HOTKEY消息,响应 ctrl + d 按键
- wParam = 0;
- lParam = MAKELONG(MOD_CONTROL,'D');
- ::SendMessage(hEditWnd,WM_HOTKEY, wParam, lParam);