iTimothy

君看一叶舟,出没风波里

0%

程序热键的实现

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

[解决方法] 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+D的快捷键组合功能.在调用该函数后你的进程会在ALT+D按下时比系统先得到通知.你需要处理的消息是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;
   }

   大家试试此功能,希望有不对之处给以指正.
支持原创技术分享,据说打赏我的人,都找到了女朋友!