VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 124|回复: 10

[已解决]如何给MFC按钮加快捷键

[复制链接]
38_avatar_middle
最佳答案
0 
在线会员 发表于 2020-6-8 06:47:47 | 显示全部楼层 |阅读模式
我个人找了很多资料,但是重载虚函数PreTranslateMessage无法重载,谁能分享详细的教程吗如何给MFC按钮加快捷键
最佳答案
70_avatar_small
2020-6-8 15:13:18
本帖最后由 tony666 于 2020-6-8 15:14 编辑
sqqlj 发表于 2020-6-8 15:07
有没有不需要焦点就能控制按钮的方法


注册系统热键,详细的你可以百度一下
  1. RegisterHotKey(this->GetSafeHwnd(),此热键唯一ID,MOD_CONTROL,'C');
复制代码


另外这个函数可能失败,注意判断
若为一热键定义的击键己被其他热键所定义,则RegisterHotKey函数调用失败。




上一篇:使用 ShellExecuteEx 函数打开 C:\Windows 目录的文件属性对话框。
下一篇:关于zlib使用问题,网站用gzip
38_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-8 15:56:00 | 显示全部楼层
menu添加global快捷键,以对话框程序为例:
在OnInitDialog中添加注册热键的代码:
RegisterHotKey(GetSafeHwnd(),1001,NULL,VK_F2);//F2键
RegisterHotKey(GetSafeHwnd(),1002,MOD_ALT,'1');//Alt+1键

BEGIN_MESSAGE_MAP(CXXXDlg, CDialog)
...
END_MESSAGE_MAP()
中添加WM_HOTKEY的消息映射:
ON_MESSAGE(WM_HOTKEY,&CXXXDlg::OnHotKey)//快捷键消息映射手动加入
在头文件中添加OnHotKey的声明:
protected:
afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);//手动加入.

CPP中OnHotKey的实现代码:
//相应快捷键的消息映射
LRESULT CXXXDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
    if(wParam ==1001)
    {  
        MessageBox("热键F2已经按下!");
        //这里可以加上你按钮要执行的操作,或者直接调用按钮映射的消息函数
    }
    else if (wParam==1002)
    {
        MessageBox("热键ALT+1已经按下!");
    }
    return 0;
}
关闭对话框时使用
UnregisterHotKey(GetSafeHwnd(),1001);//注销F2键
UnregisterHotKey(GetSafeHwnd(),1002);//注销Alt+1键
注销热键.
    dlg.imoshi = 1;//自己添加的  模式变量

点评

希望对其他人有帮助  发表于 2020-6-8 15:58
70_avatar_middle
最佳答案
12 
在线会员 发表于 2020-6-8 08:59:52 | 显示全部楼层
可以参照这个,
  1. BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
  2. {
  3.         // TODO: Add your specialized code here and/or call the base class
  4.         if(pMsg->message == WM_KEYDOWN)  
  5.         {
  6.                 switch (pMsg->wParam)
  7.                 {   
  8.                 case VK_ESCAPE:   
  9.                         return TRUE;  
  10.                 case VK_RETURN:
  11.                                 OnBnClickedButton1();
  12.                         return TRUE;
  13.                 case VK_SPACE:
  14.                                 OnBnClickedBtn2();
  15.                         return TRUE;
  16.                 }
  17.         }

  18.         return CDialog::PreTranslateMessage(pMsg);
  19. }
复制代码
87_avatar_middle
最佳答案
10 
在线会员 发表于 2020-6-8 09:36:01 | 显示全部楼层
网上关于实现这种需求的代码太多,但很多初学者都忽略了一点,就是要获得焦点,如果没有获得焦点,就不一定能实现需求!
38_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-8 12:05:10 | 显示全部楼层
tony666 发表于 2020-6-8 08:59
可以参照这个,

就是这个问题
0431.png
38_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-8 12:06:24 | 显示全部楼层
cqzj70 发表于 2020-6-8 09:36
网上关于实现这种需求的代码太多,但很多初学者都忽略了一点,就是要获得焦点,如果没有获得焦点,就不一定 ...

没有获得焦点就不能接受快捷按键消息
还是可以接受但不能控制按钮呢
38_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-8 14:19:50 | 显示全部楼层
cqzj70 发表于 2020-6-8 09:36
网上关于实现这种需求的代码太多,但很多初学者都忽略了一点,就是要获得焦点,如果没有获得焦点,就不一定 ...

注册一个系统级热键就行
70_avatar_middle
最佳答案
12 
在线会员 发表于 2020-6-8 15:00:28 | 显示全部楼层

你没声明PreTranslateMessage吧,
如果窗口没有焦点,消息是进不来PreTranslateMessage的
38_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-6-8 15:07:42 | 显示全部楼层
tony666 发表于 2020-6-8 15:00
你没声明PreTranslateMessage吧,
如果窗口没有焦点,消息是进不来PreTranslateMessage的

有没有不需要焦点就能控制按钮的方法
70_avatar_middle
最佳答案
12 
在线会员 发表于 2020-6-8 15:13:18 | 显示全部楼层    本楼为最佳答案   
bestAnswer
本帖最后由 tony666 于 2020-6-8 15:14 编辑
sqqlj 发表于 2020-6-8 15:07
有没有不需要焦点就能控制按钮的方法


注册系统热键,详细的你可以百度一下
  1. RegisterHotKey(this->GetSafeHwnd(),此热键唯一ID,MOD_CONTROL,'C');
复制代码


另外这个函数可能失败,注意判断
若为一热键定义的击键己被其他热键所定义,则RegisterHotKey函数调用失败。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-7-14 15:46

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表