第一步:
在你希望接受热键的窗口中添加下面的函数定义和函数体,这个例子中我们选择了View(视图)窗口。
头文件中添加
class CHkTestView : public CView
{
...
/// 热键
void RegisterHK(void);
void UnRegisterHK(void);
UINT m_uAtomTest1,m_uAtomTest2;
...
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CHkTestView)
...
afx_msg LONG OnHotkey(WPARAM wP,LPARAM lP);
//}}AFX_VIRTUAL
...
};
CPP文件中添加
void CHkTestView::RegisterHK(void)
{
//解释表示热键的字符串,每个字符串由以下部分组成ACWS_KEY,例如A_W__F表示 Alt+Win+F
// config hotkey
if(!CHotkeyEnhance::AddAtomAndRegisterHK(GetSafeHwnd(),m_uAtomTest1,"AC___1"))
//alt+ctrl+a
m_uAtomTest1=0;
if(!CHotkeyEnhance::AddAtomAndRegisterHK(GetSafeHwnd(),m_uAtomTest2,"_C___27"))
//ctrl+f1
m_uAtomTest2=0;
}
void CHkTestView::UnRegisterHK(void)
{
if(m_uAtomTest1)
UnregisterHotKey(GetSafeHwnd(),m_uAtomTest1);
if(m_uAtomTest2)
UnregisterHotKey(GetSafeHwnd(),m_uAtomTest2);
}
第二步:
添加消息处理相关代码。
头文件中添加
class CHkTestView : public CView
{
...
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CHkTestView)
...
afx_msg LONG OnHotkey(WPARAM wP,LPARAM lP);
//}}AFX_VIRTUAL
...
};
CPP文件中添加
BEGIN_MESSAGE_MAP(CHkTestView, CView)
ON_MESSAGE(WM_HOTKEY,OnHotkey)
//消息映射,必须添加,否则无法接收消息
...
END_MESSAGE_MAP()
LONG CHkTestView::OnHotkey(WPARAM wP,LPARAM lP)
{
TRACE("hot key press %d
",wP);
if(wP== m_uAtomTest1)
{//判断热键
AfxMessageBox("test 1");
}
else if(wP== m_uAtomTest2)
{
AfxMessageBox("test 2");
}
else
{
AfxMessageBox("unknown hotkey");
}
return 0;
}
第三步:
Windows系统允许用户自己定义热键,定义热键时先添加利用AddAtom一个原子Atom,然后使用RegisterHotKey注册热键。一个热键可以由Alt,Shift,Alt,Win与F1-F12,A-Z组合而成。
当热键被按下时,系统会发送WM_HOTKEY消息给注册热键时指定的窗口,消息中的第一个参数就是热键对应的原子值。
理解CHotkeyEnhance的用法,CHotkeyEnhance是我自己开发的一个类,封装了部分HotKey的函数。
CHotkeyEnhance使用字符串来表示热键,每个字符串由以下部分组成ACWS_KEY,例如A_W__6表示 Alt+Win+F
ACWS 分别代表 alt ctrl win shift
最后一个字符 代表由 A-Z 的数字,1 代表A,26代表Z
如果大于26 则表示F1-F12 27代表F1
前部分和后部分之间通过下划线 _ 进行连接
欢迎评论或投稿