| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3892 人关注过本帖, 1 人收藏
标题:MFC热键设置
只看楼主 加入收藏
zaroty
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2008-3-28
收藏(1)
 问题点数:0 回复次数:3 
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的方法)的话,希望您能转告我,谢谢!
搜索更多相关主题的帖子: 编程 热键 
2008-08-25 18:26
lyd253261362
Rank: 1
等 级:新手上路
帖 子:91
专家分:2
注 册:2007-4-26
收藏
得分:0 
长见识!
长见识!
2008-08-26 08:44
zaroty
Rank: 1
等 级:新手上路
帖 子:93
专家分:0
注 册:2008-3-28
收藏
得分:0 
本来想能发成原创帖子的。原来原创帖子的要求是在本站原创的额。。。。而不是要求作者原创。。。。

http://hi.baidu.com/zaroty  偶滴博客
2008-08-26 09:29
megonlee
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2008-8-28
收藏
得分:0 
好文章~~收藏下来了  刚学习 东西太多 不好弄呀
2008-08-28 12:00
快速回复:MFC热键设置
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023417 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved