• MFC程序添加快捷键


    [问题提出]
         有的程序需要自定义组合键完成一定功能,如何实现?

       [解决方法]
         RegisterHotKey函数原型及说明:
         BOOL RegisterHotKey(
         HWND hWnd,                     // 接收WM_HOTKEY的窗口句柄
         int id,                        // hot key的ID号.
         UINT fsModifiers,              // 响应那个热键.
         UINT vk                        // 与热键配合的键.

         其中:
           1)id的说明:
           id为你自己定义的一个ID值,对一个线程来讲其值必需在0x0000 - 0xBFFF范围之内,对DLL来讲其值必需在0xC000 - 0xFFFF 范围之内,在同一进程内该值必须唯一

           2)fsModifiers的取值如下:
             .MOD_ALT
             .MOD_CONTROL
             .MOD_SHIFT
             .MOD_WIN

       [程序实现]
         建立名为My的对话框工程.本例要用到RegisterHotKey()实现Alt+E的快捷键组合功能.在调用该函数后你的进程会在ALT+E按下时比系统先得到通知.你需要处理的消息是WM_HOTKEY.
         如下:

         在MyDlg.h中:
         class CMyDlg : public CDialog
         {
              // Construction
              public:
                  int m_nHotKeyID;//为你自己定义的一个hot key的ID值,在整个程序唯一.
              ........
              protected:
                  HICON m_hIcon;

              // Generated message map functions
              //{{AFX_MSG(CMyDlg)
              virtual BOOL OnInitDialog();
              afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
              afx_msg void OnPaint();
              afx_msg HCURSOR OnQueryDragIcon();
              afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);//手动加入.
              //}}AFX_MSG   
              DECLARE_MESSAGE_MAP()
         };
        
         在MyDlg.cpp中:
         #define VK_D 68

         ..............
         BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
              //{{AFX_MSG_MAP(CHotKey1Dlg)
              ON_WM_SYSCOMMAND()
              ON_WM_PAINT()
              ON_WM_QUERYDRAGICON()
              ON_BN_CLICKED(IDOK, OnRegisterHotKey)
              ON_BN_CLICKED(IDCANCEL, OnUnregisterHotKey)
              ON_MESSAGE(WM_HOTKEY,OnHotKey)                      //手动加入.
              //}}AFX_MSG_MAP
         END_MESSAGE_MAP()

         BOOL CMyDlg::OnInitDialog()
         {
              CDialog::OnInitDialog();

              // Add "About..." menu item to system menu.
              m_nHotKeyID=0;
              BOOL m_isKeyRegistered =RegisterHotKey(GetSafeHwnd(),m_nHotKeyID,MOD_ALT,VK_D);
              ASSERT(m_isKeyRegistered != FALSE);
              return TRUE;   // return TRUE   unless you set the focus to a control
         }
        
         在取消按钮的事件函数中加入:
         void CMyDlg::OnCancel()
         {
              BOOL m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
              ASSERT(m_iskeyUnregistered != FALSE);
              CDialog::OnCancel();
         }

         处理截到的组合键,并处理:
         LONG CMyDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
         { 
              AfxMessageBox("你按下了组合键:Alt+D");
              //加入相关代码.
              return 0;
         }

  • 相关阅读:
    Windows脚本转换Liunx识别并执行
    分布式事物常见解决方案
    SIMD加速计算矩阵(组成原理实验5)
    Code-server搭建web IDE
    CentOS 8 修改SSH端口
    Floyd算法的原理和实现代码
    initNativeTransServiceId . ntrans:object componentId :-368613127 微信小程序
    对象搜索算法挑战
    微信小程序小窗无效
    《六层楼》--宋东野
  • 原文地址:https://www.cnblogs.com/xingrun/p/3470136.html
Copyright © 2020-2023  润新知