程序热键的实现

博客围绕程序自定义组合键功能的实现展开。介绍了RegisterHotKey函数原型及参数说明,包括id取值范围、fsModifiers取值等。以建立My对话框工程为例,展示了如何用该函数实现Alt+D快捷键组合功能,还给出了相关代码及取消注册热键的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[问题提出]  
       有的程序需要自定义组合键完成一定功能,如何实现?  
 
   [解决方法]  
       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;  
       }  
 
       大家试试此功能,希望有不对之处给以指正.   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值