• [转]RegisterHotKey


    RegisterHotKey()实现Alt+E的快捷键组合功能
    [问题提出]
         有的程序需要自定义组合键完成一定功能,如何实现?

       [解决方法]
         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_E);
              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+E");
              //加入相关代码.
              return 0;
         }
     
  • 相关阅读:
    sap 登陆增强
    去除字符串末尾的空格
    abap 动态控制状态栏按钮
    首页菜单显示TCODE
    me23n去价格
    abap 导出数据到excle,粘贴复制法
    TCODE找相應的BAPI(主要是找到包PACKAGE)
    Sap自动编号工具(SNRO)
    jQuery 实现置顶效果
    order by 不能使用别名
  • 原文地址:https://www.cnblogs.com/answer/p/1210184.html
Copyright © 2020-2023  润新知