文档章节

VC如何注册、屏蔽全局键盘热键

IMGTN
 IMGTN
发布于 2013/01/09 15:55
字数 844
阅读 4118
收藏 0
 VC如何注册、屏蔽全局键盘热键

1、定义按键消息热键的宏,后续可自行添加更多

/************************************************************************/  
// VirtualKey.H     By:Koma 2009.08.22  
// 定义热键  
// http://blog.csdn.net/wangningyu  
  
/************************************************************************/  
/* Ctrl组合键 (D、F2、F8、F9、F10、F11、F12              共6个) 
/************************************************************************/  
#define IDH_HOT1        4001  
#define IDH_HOT2        4002  
#define IDH_HOT3        4003  
#define IDH_HOT4        4004  
#define IDH_HOT5        4005  
#define IDH_HOT6        4006  
#define IDH_HOT19       4019  
  
/************************************************************************/  
/* Alt组合键 (F1、F4、F9                             共3个) 
/************************************************************************/  
#define IDH_HOT7        4007  
#define IDH_HOT8        4008  
#define IDH_HOT9        4009  
  
/************************************************************************/

2、注册全局的热键,从而实现屏蔽热键

/************************************************************************/    
/* 函数说明:MFC初始化函数,用来注册全局热键                                        
/* 参    数:无                                    
/* 返 回 值:成功返回TRUE、失败返回FALSE     
/* By:Koma   2009.07.30 17:50                                 
/************************************************************************/   
BOOL CHookKBDlg::OnInitDialog()  
{  
    CDialog::OnInitDialog();  
    // 如果需要添加其他的组合键,需要在VirtualKey.h添加记录  
    // 在OnInitDialog、PreTranslateMessage中各添加一行代码即可  
  
    // Ctrl组合键 (D、F2、F8、F9、F10、F11、F12              共7个)  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT1, MOD_CONTROL, VK_F2);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT2, MOD_CONTROL, VK_F8);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT3, MOD_CONTROL, VK_F9);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT4, MOD_CONTROL, VK_F10);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT5, MOD_CONTROL, VK_F11);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT6, MOD_CONTROL, VK_F12);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT19, MOD_CONTROL, 'D');  
  
    // Alt组合键 (F1、F4、F9                             共3个)  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT7, MOD_ALT, VK_F1);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT8, MOD_ALT, VK_F4);  
    RegisterHotKey(this->GetSafeHwnd(),IDH_HOT9, MOD_ALT, VK_F9);  
  
    return TRUE;  // return TRUE  unless you set the focus to a control  
}

3、有点像"占着茅坑不拉S”,直接过滤掉此消息...

/************************************************************************/    
/* 函数说明:MFC虚函数,用来屏蔽热键                                        
/* 参    数:无                                    
/* 返 回 值:屏蔽返回TRUE、不屏蔽返回FALSE     
/* By:Koma   2009.07.30 17:50                                 
/************************************************************************/    
BOOL CHookKBDlg::PreTranslateMessage(MSG* pMsg)   
{  
    // TODO: Add your specialized code here and/or call the base class  
    if(pMsg->message==WM_HOTKEY)    
    {     
        switch(pMsg->wParam)  
        {  
        case IDH_HOT1:  
        case IDH_HOT2:  
        case IDH_HOT3:  
        case IDH_HOT4:  
        case IDH_HOT5:  
        case IDH_HOT6:  
        case IDH_HOT7:  
        case IDH_HOT8:  
        case IDH_HOT9:  
            // MessageBox(_T("此类组合键严禁使用!"));  
            // true 标示处理过此消息不再投递到消息队列,  
            SetDlgItemText(IDC_STATIC1,"别按了,没用的!");  
            return TRUE;  
        }  
    }     
    return CDialog::PreTranslateMessage(pMsg);  
}
注意:   取消注册热键用 UnregisterHotKey(......)

 ------------------------------------------

MFC 热键设置 OnHotKey方法和Accelerator方法的设置

在写MFC程序时,如果想自定义热键比如ALT+S可以采用下面两种方法:

方法一:定义热键的消息响应函数:OnHotKey
定义系统全局热键:

1、首先在.h文件中添加消息响应函数声明
  afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam);
2、关联消息及响应函数
      BEGIN_MESSAGE_MAP()
   ON_MESSAGE(WM_HOTKEY,OnHotKey)
END_MESSAGE_MAP()

3、在初始化函数里注册热键
RegisterHotKey(m_hWnd,ID_HOTKEY,MOD_ALT,‘s’);  
// ID_HOTKEY是自己定义的一个ID宏
‘s'可以写成ASCII码

4、在消息响应函数里添加操作
LRESULT  CMyTest::OnHotKey(WPARAM wParam,LPARAM lParam) 
 { 
 UINT Mod = (UINT) LOWORD(lParam); // key-modifier flags 
 UINT uVirtKey = (UINT) HIWORD(lParam); // virtual-key code 
 //判断响应了什么热键 
 if( MOD_CONTROL ==  Mod  && ‘s’ == uVirtKey ) 
 { 
 AfxMessageBox(_T("你按下了组合键 ALT+ S"));
 } 
 else 
 AfxMessageBox(_T("你按下了未知热键")); 
 return 0; 
 }
 

方法二: 
Accelerator方法 只在本应用程序内有效
http://support.microsoft.com/?kbid=222829  
1、插入一个新的Accelerator到资源里,把加速键和对应的响应控件(如一个按钮)关联 
2、在对话框头文件中声明: 
     HACCEL   m_hAccel; 
3、在对话框的构造函数里初始化m_hAccel 
    m_hAccel   =   ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_ACCELERATOR1)); 
4、然后重载对话框的PreTranslateMessage函数,在 
BOOL   CAboutDlg::PreTranslateMessage(MSG*   pMsg)   

      if   (m_hAccel)   
      { 
            if   (::TranslateAccelerator(m_hWnd,   m_hAccel,   pMsg))   
            { 
                  return(TRUE); 
            } 
      } 
      return   CDialog::PreTranslateMessage(pMsg); 


然后重载 OnCommand();函数;
BOOL CFreeChatDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
if (ID_ALT_S == LOWORD(wParam))//ID_ALT_S是在 Accelerator中注册快捷键的ID
{
//加入响应的快捷键的操作
}
return CDialog::OnCommand(wParam,lParam);
}


希望能帮你少走点弯路^^

注意:   取消注册热键用 UnregisterHotKey(......)




本文转载自:

IMGTN
粉丝 24
博文 271
码字总数 240775
作品 0
珠海
私信 提问
加载中

评论(1)

hacksb888
hacksb888
怎样去屏蔽所有的热键(除了系统自带的),比如说QQ的截图快捷键,按键会改变,不是那种固定的。。谢谢
远程线程注入技术 屏蔽ctrl+alt+del

在NT/2000中怎么禁用Ctrl+Alt+Delete?(不能用gina,键盘驱动) 在Windows2000中Ctrl-Alt-Delete组合键的处理如下: Winlogon初始化的时候,在系统中注册了CTRL+ALT+DEL Secure Attention Seq...

微wx笑
2017/02/15
0
0
C# .NET锁屏程序(顺带屏蔽任务管理器)

原文:C# .NET锁屏程序(顺带屏蔽任务管理器) 第一步:将窗体的FormBorderStyle设置为none,WindowState设为Maximized 占据整个屏幕。 第二步:使用钩子监控全局键盘事件。即屏蔽掉大部分系统...

杰克.陈
2018/06/14
0
0
Qt全局热键(windows篇)

本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息、原文链接、原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途。 谢谢合作。 原文链接:Qt全局热键(window...

xiangxw
2011/03/26
0
0
斌哥豆瓣FM客户端

斌哥豆瓣FM桌面版,是一款第三方豆瓣FM客户端(PC版)。 软件使用 AAuto 语言编写,源码下载地址 http://wubin.in/app/source/doubanFM.20140101.7z 斌哥豆瓣FM第三方客户端,可替代豆瓣FM官...

搞起
2014/01/03
1K
1
Windows中系统范围热键的实现方法

在Windows环境下运行的程序,大多数都支持热键,热键一般被人们称为快捷键,例如:大多数Windows程序都支持“复制”和“粘贴”操作,它们的快捷键一般是:“Ctrl+C”和“Ctrl+V”;在“记事本...

余二五
2017/11/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

lombok的一个踩坑记录

lombok的类如下所示: package com.divx.service.model.task;import com.divx.service.model.BaseTypeMedia;import lombok.Data;/** * @author wuzhilang * @Title: QuestionResult ......

无知的小狼
29分钟前
2
0
如何使用markdown

我没有导入相应的包 这个用的还是有些问题 而且显示的时候格式问题还没解决 <div class="blog_editor" style="margin: 0 auto;width:60%;height:1000px;background-color: white;"> <div s......

南桥北木
32分钟前
4
0
纯手写SpringBoot框架之注解方式启动SpringMVC容器

使用Java语言创建Tomcat容器,并且通过Tomcat执行Servlet,接下来,将会使用Java语言在SpringBoot创建内置Tomcat,使用注解方式启动SpringMVC容器。 代码实现。 1.pom.xml文件,需要依赖的jar...

Java老王
33分钟前
2
0
Presto查询引擎简单分析

Hive查询流程分析 各个组件的作用 UI(user interface)(用户接口):提交数据操作的窗口 Driver(引擎):负责接收数据操作,实现了会话句柄,并提供基于JDBC / ODBC的execute和fetch API Metas...

MobService
35分钟前
1
0
《软件架构的10个常见模式》,看完真心觉得不错

作者:半吊子全栈工匠原文链接:https://blog.csdn.net/wireless_com/article/details/89008061 企业规模的软件系统该如何设计呢?在开始写代码之前,我们需要选择一个合适的架构,这个架构...

Java干货分享
47分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部