很多情况下,我们需要给程序添加一个系统级的热键。就像常用的QQ在启动后,任何时间只要按下Ctrl + Alt + z就能将QQ的主界面调出。当然,我们还可以干其他很多事情!:)
我们在为程序加上热键后,每当按下你所设定的快捷键,就会给主窗口发出一个WM_HOTKEY的消息,但很可惜,Class Wizartd并没有它。因此,我们需要按照以下步骤进行处理:
假设Project的名字是Temp,那么操作如下:
1、在TempView.h文件中消息映射的说明处加入热键消息处理函数的声明。
//{{AFX_MSG(CTempView)
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnDestroy();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnKillFocus(CWnd* pNewWnd);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
//}}AFX_MSG
LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);//此句为加入内容,声明热键消息处理函数。
DECLARE_MESSAGE_MAP()
2、 接着在TempView.cpp中消息映射的定义处是用消息映射宏指定热键消息WM_HOTKEY的消息处理函数。
BEGIN_MESSAGE_MAP(CTempView, CView)
//{{AFX_MSG_MAP(CTempView)
ON_WM_CHAR()
ON_WM_DESTROY()
ON_WM_CREATE()
ON_WM_KEYDOWN()
ON_WM_KEYUP()
ON_WM_HSCROLL()
ON_WM_KILLFOCUS()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_HOTKEY,OnHotKey) //此句为手工加入内容,指定了热键消息的处理函数。
END_MESSAGE_MAP()
3、在 OnCreate()函数中登记热键'*'。
int CTempView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
::RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_ALT,'*');//登记热键.
注:'*'应改为虚拟键码 VK_MULTIPLY ,0-9,A-Z虚拟键码为其ASCII码 可以用(UINT)'A'强制类型转换
return 0;
}
4、在TempView.cpp中编写OnHotKey()函数,当按下热键'*'时程序变为前台,并跳出一个消息框。
LRESULT CTempView::OnHotKey(WPARAM wParam,LPARAM lParam)
{
if(wParam==1001)
MessageBox("I have been activated!!");
return 0;
}
5、注销热键,释放系统资源.
void CTempView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
UnregisterHotKey(m_hWnd,1001);//注销热键,释放系统资源.
}