目录

MFC 控件添加热键

给MFC中的控件添加我们想要的控件热键,在动手之前,必须清楚,热键分为local的和global的, 其中local的职能在当前程序有焦点(被激活)时有效,而global的,则无论什么时候都有效,测试local的要优先于global的,就是如果当前激活窗口的快捷键与未激活窗口的快捷键重叠,当前激活窗口优先响应。另外还包括menu,button。

自然而然,创建热键的方法也有多种,不同的创建方法创建的热键作用范围不一定相同。应该根据需求合理的选择自己的方法。

方法一:

打开对话框资源,选择指定控件的属性–>在caption项中你定义的名字后添加(&Y)。这样就可以实现热键。其中Y表示你要制定的快捷按键,我选的是Y,按下ALT+Y即可执行这个控件。

该方式热键只有当FOCUS在控件上时才起作用,算是局部热键。

方法二:

  1. 在资源视图中添加资源,选择"Accelerator"选项新建即可;

  2. 打开新建的文件夹下的"IDR_ACCELERATOR1"中编辑,其中包括ID、修饰符、键、类型。ID中选择你要添加快捷键的菜单、按钮的ID编号,修饰符中选择你是否要使用组合键,如:Alt、Alt+Shift等等,键中选择你要使用什么样的虚拟键码,类型中选择VK形式或者是ASCII形式。

  3. 在你的对话框的头文件中添加快捷键变量,如HACCEL m_hAcc;

  4. 在你的对话框的源文件的OnInitDialog函数中加载快捷键,如:

1
HACCEL m_hAcc=LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1));
  1. 重载函数PreTranslateMessage,使用类向导,重载虚函数PreTranslateMessage,如:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
BOOL CAutoToolDlg::PreTranslateMessage(MSG* pMsg)
{
    if (WM_KEYFIRST<=pMsg->message&&pMsg->message<= WM_KEYLAST) 
    { 
        HACCEL hAccel=m_hAcc; 
        if (hAccel && ::TranslateAccelerator(m_hWnd, hAccel, pMsg)) 
        return TRUE;
    } 
    return CDialogEx::PreTranslateMessage(pMsg);
}
  1. 通过以上5个步骤基本上即可对工程中的菜单或者按钮添加热键。

方法三:

使用WM_HOTKEY。

  1. 在对话框头文件中:

  2. 1
    2
    
    afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
    afx_msg void OnDestroy();
    
  3. 在对话框CPP文件中:

  4. 1
    2
    3
    4
    
    BEGIN_MESSAGE_MAP(CYourDlg, CDialog)
       ON_MESSAGE(WM_HOTKEY,OnHotKey) 
       ON_WM_DESTROY()
    END_MESSAGE_MAP()
    
  5. hotkey对应映射:

  6. 1
    2
    3
    4
    5
    6
    7
    
    LRESULT CYourDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
    {
        ifwParam==IDC_XXX
            OnYourFunction();
    //ToDo: add function
         return 0; 
    }
    
  7. 注册热键:

  8. 1
    2
    3
    4
    
    BOOL CYourDlg::OnInitDialog()
    {
        ::RegisterHotKey(GetSafeHwnd(), IDC_XXX, MOD_ALT, 'D');//注册热键alt+D(D必须大写)
    }
    
  9. 记得销毁:

  10. 1
    2
    3
    4
    
    void CYourDlg::OnDestroy()
    {
        ::UnregisterHotKey(GetSafeHwnd(),IDC_XXX);//销毁热键
    }
    

另外一篇参考:http://lty2154216.blog.163.com/blog/static/17982629320117129491666/