MFC热键设置
前置知识:VC MFC关键字:热键 MFC 呼出 VC
感觉有好多天没有学到什么东西了,昨天晚上想把那个IE监视器修改一下,设置一下隐藏和呼出的热键。
于是,就有了这篇文章。闲话不多说,下面进入正题:
在MFC工程里设置热键,我去网上搜了之后大致有两种方法:
1)Accelerator的方法
2)RegisterHotKey() WIN-API的方法
因为第一种方法我没有找到多少资料,本人资质不佳,没能理解是怎么实现的,
所以,在这里仅仅讨论第二种情况,也就是用WIN-API的方法来设置热键。
1、在你需要热键的窗体上增加HOTKEY(热键)控件
2、在ClassWizard里面增加一个m_Hotkey对象
3、通过m_Hotkey对象来设置一下热键的相关内容
找到IECLOSERDlg.cpp(你的程序可能是ExampleDlg.cpp,红色为工程名称)
在窗体OnInitDialog()中添加代码
BOOL CIECLOSERDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_Hotkey.SetRules(HKCOMB_C,HOTKEYF_CONTROL);
m_Hotkey.SetHotKey(VK_F9,HOTKEYF_CONTROL);
4、用RegisterHotKey来注册热键
这个注册热键部分的代码,你可以放在OnInitDialog()这里,
也可以放在其他的窗体初始化的时候需要执行的部分。
这段代码是紧接着上面的:
WORD virtualcode,modifiers;
m_Hotkey.GetHotKey(virtualcode,modifiers);
if (!RegisterHotKey(this->m_hWnd,100,modifiers,virtualcode))
{
MessageBox("热键冲突!");
}
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
这样我们就登记了系统热键,但是仅仅这样,
你所写的程序还是不能相应这个热键的,因为我们还没有写热键处理的代码。、
5、程序写到这个地方,在我们运行程序,并且按下Ctrl+F9 的时候,我们的程序就会收到一个WM_HOTKEY 消息。
所以呢,我们就要对这个消息的映射进行处理。
然而当我们打开ClassWizard,对这个消息进行映射的时候,我们发现了一个我们不想看到的内容:
没有WM_HOTKEY的消息映射!
既然,微软没有把这个消息进行封装,那么我们就要自己动手了。
同样,还是在IECLOSERDlg.cpp中,找到消息映射的那一部分,添加ON_MESSAGE(WM_HOTKEY,OnHotKey) ,如下:
BEGIN_MESSAGE_MAP(CIECLOSERDlg, CDialog)
//{{AFX_MSG_MAP(CIECLOSERDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_EXIT, OnExit)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_DEL, OnDel)
ON_BN_CLICKED(ID_MONITOR, OnMonitor)
ON_WM_TIMER()
ON_BN_CLICKED(ID_CLEAR, OnClear)
ON_BN_CLICKED(IDC_HIDE, OnHide)
ON_BN_CLICKED(IDC_STOP, OnStop)
ON_MESSAGE(WM_HOTKEY,OnHotKey)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
这样添加之后,我们就对WM_HOTKEY消息进行了映射,
也就是说当我们按下指定的热键之后,系统就会调用OnHotKey函数来进行处理。
下面我们就要在头文件里面对OnHotKey函数进行声明,找到IECLOSERDlg.h,
在相应位置添加afx_msg void OnHotKey(WPARAM wParam,LPARAM lParam);如下:
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CIECLOSERDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnExit();
afx_msg void OnAdd();
afx_msg void OnDel();
afx_msg void OnMonitor();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnClear();
afx_msg void OnHide();
afx_msg void OnStop();
afx_msg void OnHotKey(WPARAM wp,LPARAM lp);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
6、现在,程序的热键就算是设置成功了,就等我们去把OnHotKey函数写出来处理这个消息了,
本例子设置热键想要实现的功能是将隐藏的窗体显示出来,所以就定义了下面函数:
在IECLOSERDlg.cpp中添加如下代码:
void CIECLOSERDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
if (wParam==100)
{
UpdateData(TRUE);
ShowWindow(SW_SHOW);
}
}
当然,你可以按照你自己的需要来设定相应的代码,比如用ShellExecute打开什么文件。
到此,我们的MFC热键算是设置完毕。(这里的HOTKEY控件也可以不用,他的作用仅仅是设置一些热键的规则等)
小菜不才,写的文章可能比较乱也比较啰嗦,欢迎大家指正。
另外,如果有哪位朋友知道本文所说的第一种方法(Accelerator的方法)的话,希望您能转告我,谢谢!