VC++实现自定义热键

热键一般是有Ctrl+其他键位或Alt+其他键位或Ctrl+Alt+其他键位构成。关于如何建立自己的热键,
   
   下面就有详细的说明:
   
   1:要定义一个热键(组合键)即必须先为热键赋于一个自定义的ID,用来给系统标识该热键。注意,
   
   自定义的ID(int型)必须是唯一的,既不能与系统的其他ID相冲突。
   
   2 运用函数RegisterHotKey
   
   (
   
   HWND hWnd, // 接收WM_HOTKEY的窗口句柄
   
   int id, // hot key的ID号。
   
   UINT fsModifiers, // 响应那个热键。
   
   UINT vk // 与热键配合的键虚位码
   
   )
   
   当配合建为a(A) -z(Z),
   
   和 0 - 9时,伴随建虚伪码可以用诸如'a','0'的形式代替。hWnd 为接受热键的窗口句柄,可以用
   
   GetSafeHwnd()函数获得。自定义热键ID对于一个线程来讲一般设在0x0000 到0xBFFF(49151)之间,对于一个
   
   DLL来讲其值一般设在0xC000(49152) 到0xBFFF(49151)之间。
   
   fsModifiers可取如下值
   
   MOD_ALT ;MOD_CONTROL ;MOD_SHIFT ;MOD_WIN 或他们的组合(中间用|连接)
   
   3 定义热键的同时一般也要自定义热键相应的响应函数,其定义方法如下:
   
   (1):先在某个类的头文件的其他消息响应函数的声明处按照相应的格式加上如下语句
   
   afx_msg long OnHotKey(WPARAM wParam,LPARAM lParam);//wParam一般为热键消息的ID
   
   (2): 在相应类的。cpp文件的消息映射宏BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP之间加上同其他消息
   
   响应宏声明相同格式的自定义消息响应宏ON_MESSAGE(WM_HOTKEY,OnHotKey)
   
   (3):然后就运用RegisterHotKey(…)函数定义快捷键。并在相应的消息响应函数OnHotKey(…)中加
   
   如相应的处理代码。注意消息响应函数一定要有返回值,其可以使HRESULT,int ,long等数据类
   
   型。
   
   (4): 用完后不要忘了在OnDestory(…)函数或OnCancel(…)中解除函数登记,释放系统资源。此时
   
   要调用函数 bool UnregisterHotKey(hWnd,VK(ID));
   
   4 相应的例子如:
   
   [程序实现]
   
   建立名为My的对话框工程。本例要用到RegisterHotKey()实现Alt+D的快捷键组合功能。在调用该函数后你的进程会在ALT+D按下时比系统先得到通知。你需要处理的消息是WM_HOTKEY.
   
   如下:
   
   在MyDlg.h中:
   
 

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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中:
   
 

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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
      
   }


   
   在取消按钮的事件函数中加入:
   

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
void CMyDlg::OnCancel()
     
  {
     
  BOOL m_iskeyUnregistered = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID);
     
  ASSERT(m_iskeyUnregistered != FALSE);
     
  CDialog::OnCancel();
     
  }


   
   处理截到的组合键,并处理:
   
   

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
LONG CMyDlg::OnHotKey( WPARAM wParam, LPARAM lParam) //wParam一般为热键消息的ID
        
     {
        
     AfxMessageBox( "你按下了组合键:Alt+D" );
        
     //加入相关代码。
        
     return 0;
        
     }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值