松鼠的博客

导航

统计

程序热键的实现

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

   [解决方法]  
       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;  
       }  

posted on   Xproer-松鼠  阅读(252)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示