一、热键注册

步骤一:声明一个全局量int hotkeyId=1:

步骤二:窗体创建的时候注册:

int result= RegisterHotKey(this->GetHWND(), hotkeyId, MOD_ALT, 'C');

步骤三:热键消息处理(窗体消息处理函数中)

if (uMsg == WM_HOTKEY)
{
if (hotkeyId == wParam)
{
DoClip();
return 0;
}
}

步骤三:窗体关闭,热键注销

int result= UnregisterHotKey(this->GetHWND(), hotkeyId);

二、组合键

例子:消息处理函数中

else if (wParam == 'C')
{
if (::GetKeyState(VK_SHIFT)<0)
{
DoClip();
} // < 0被按下
}

vc视图类程序可以接收OnKeyDown消息,但在对话框上却需要PreTranslateMessage处理按键消息,

而且系统按键Alt,F10也需要特殊处理。

还是直接上代码:

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
 // TODO: Add
your specialized code here and/or call the base class
 CString
str;
 CString strMsg;
 int
valid_down=0;
 
 static int SHIFT=0;
 int
CAPITAL=0;
 static int CTRL=0;

static int ALT=0;
 static int F10=0;
 short
key_down=0;
 short alt_down=0;
 short f10_down=0;
 short
ctrl_down=0;

//通过检测消息知道,这些键的按键状态如下:
//第1次按下为 0xFFFFFF81 ,弹起却为
1
//第2次按下为 0xFFFFFF80 ,弹起却为
0
//以后重复上述逻辑过程
//所以,最低位0x0f不容易判定,要判定高位才可

key_down = GetKeyState(VK_MENU) & 0xff00;//81
80
  if (key_down) ALT=1;
  else ALT=0;

key_down = GetKeyState(VK_SHIFT)& 0xff00;//81
80
  if (key_down) SHIFT=1;
  else SHIFT=0;

key_down = GetKeyState(VK_CONTROL)& 0xff00;//81
80
  if (key_down) CTRL=1;
  else CTRL=0;

//F10 2次点击
  key_down = GetKeyState(VK_F10) & 0xff00;//81
80
  if (key_down) F10=1;
  else F10=0;

str.Format("%0x,m=%d,w=%d,l=%ld",key_down,pMsg->message,pMsg->wParam,pMsg->lParam);//pMsg->wParam);
  SetWindowText(str);

//因为在按下Alt键后,再按其它键,就没有KEYDOWN消息,仍然是WM_SYSKEYDOWN,只不过
pMsg->wParam是按键的码制
//为了简单,这里记住ALT
F10等系统键的按下后,如果仍然有其它按键,则通过pMsg->wParam来判别
//没有系统按键,就检测WM_KEYDOWN,所以三者是并行关系

if  (  CTRL || ALT || SHIFT )
 {
  if (
pMsg->message==260 ) return
TRUE;//有其它键按键按下,直接返回,等待弹起再处理
  if (  CTRL
)
  {//Ctrl键按下时,不是一般键,或者F10键弹起,就直接返回
   if
(  (pMsg->message!=257 && pMsg->message!=261) 
) return TRUE;//有其它键按键按下,直接返回,等待弹起再处理
  }

}

if (pMsg->message==WM_KEYUP || CTRL || ALT || SHIFT ||
F10)//检测按键弹起
 {

// if  (0x8000 & GetKeyState(VK_SHIFT) ) 
SHIFT=1;
 // if  (0x8000 & GetKeyState(VK_CONTROL) ) 
CTRL=1;
 // if  (0x0080 & GetKeyState(VK_MENU) ) 
ALT=1;
  if  (GetKeyState(VK_CAPITAL)!=0) 
CAPITAL=1;
//F1-F24 
  if (pMsg->wParam>=0x70
&& pMsg->wParam<=0x87)
  {
   if
(pMsg->wParam>=0x70 &&
pMsg->wParam<=0x78)//F1-F9
    str.Format("F%c",pMsg->wParam-0x70+'1');
   else
if (pMsg->wParam>=0x79 &&
pMsg->wParam<=0x7B)//F10-F12
    str.Format("F1%c",pMsg->wParam-0x79+'0');
   else
if (pMsg->wParam>=0x7C &&
pMsg->wParam<=0x84)//F13-F21
    str.Format("F2%c",pMsg->wParam-0x7C+'3');
   else
if (pMsg->wParam>=0x85 &&
pMsg->wParam<=0x87)//F22-F24
    str.Format("F2%c",pMsg->wParam-0x85+'2');
          
   valid_down=1;
  }
//A-Z
  if
(pMsg->wParam>='A' &&
pMsg->wParam<='Z')
  {
   if ( SHIFT ||
CAPITAL
)
    str.Format("%c",pMsg->wParam);
   else
    str.Format("%c",pMsg->wParam-'A'+'a');
   valid_down=1;

}
//0-9
  if (pMsg->wParam>='0' &&
pMsg->wParam<='9')
  {//正常数字键盘
    str.Format("%c",pMsg->wParam-'0'+48);
   valid_down=1;
  }
//0-9
  if
(pMsg->wParam>=0x60 &&
pMsg->wParam<=0x69)
  {//小键盘上的数字键
    str.Format("%c",pMsg->wParam-0x60+48);
   valid_down=1;
  }

switch(pMsg->wParam)
  {
  case
VK_RETURN :
   str="回车";
   valid_down=1;
   break;
  case
VK_BACK:
           
str="back";
   valid_down=1;
//……
   
  }
  if
(valid_down==1)  //有效按键
  {
 //  if 
(CAPITAL)  str="CapsLock + "+str;
   if  (SHIFT
)  str="Shift + "+str;
   if  (ALT )  str="Alt
+ "+str;
   if  (CTRL )  str="Ctrl +
"+str;
   GetDlgItem(IDC_BUTTON1)->SetWindowText(str);

}
  
 }
 return
CDialog::PreTranslateMessage(pMsg);
}

C++添加热键和捕获组合键的更多相关文章

  1. Android 捕获组合键

    android中捕获组合键http://blog.csdn.net/wenlibin1985/article/details/5579359 Android组合键http://www.eoeandro ...

  2. C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown事件之间的区别 (附KeyChar/KeyCode值)

    1. 首先将窗口属性KeyPreview设为true,如果属性对话框中找不到,就直接在代码里添加: 2. 添加KeyPress / KeyDown事件: 1.KeyPress 和KeyDown .Ke ...

  3. [转]Delphi : keydown与keypress的区别,组合键

    Shift 是一个集合变量. type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDoubl ...

  4. Delphi : keydown与keypress的区别,组合键

    Shift 是一个集合变量. type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDoubl ...

  5. Hotkeys.js 2.0.2 发布,捕获键盘输入和输入的组合键快捷键,它没有依赖

    这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb),gzip:1.9k. 更新内容: 添加测试用例: 添加更多特殊键支持: 修复bug. __ ...

  6. Hotkeys.js 2.0.2 发布,JS 网页快捷键设置,捕获键盘输入和输入的组合键快捷键,它没有依赖

    这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb),gzip:1.9k. 更新内容: 添加测试用例: 添加更多特殊键支持: 修复bug. __ ...

  7. js简单的设置快捷键,hotkeys捕获键盘键和组合键的输入

    设置快捷键 这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb). hotkeys on Githubhotkeys预览 创建 您将需要在您的系 ...

  8. xcode/Interface Build(IB)/iPhone模拟器/mac/组合键常用的命令集

    1.Xcode常用快捷键: win+N:新建文件 win+shift+N:新建工程 win+O:打开工程或文件 win+S:保存 win+shift+S:另存为 win+Z:撤销一步 win+W:关闭 ...

  9. 关于mfc添加热键

    对于mfc的添加热键的文章已经有很多了,我这里就简单的说一下并且说一些可能出的错误 首先在资源文件中添加ACCELERATOR然后在资源文件下的RC中找到ACCELERATOR的节点,打开后可以发现一 ...

随机推荐

  1. shiro教程1(HelloWorld)

    shiro简介 官网 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授权.密码和会话管理.使用Shiro的易于理解的API,您可以快速.轻松地获得任何应用程序,从最小的移动 ...

  2. Java与c#的一些细节区别

    实习中用的语言是c#,第一次接触到这种语言,然后写的过程中,发觉和Java几乎一摸一样,好像根本是无缝切换,但细节仍有很大的区别,称有空总结一波里面的部分细节实现. ps. 我写c#过程中,发觉c#有 ...

  3. MPLS笔记

    Label一般是由运营商端的Router添加. 去往相同网段的数据包打相同的标签 基于每个数据包的负载均衡基于目的地的负载均衡 启用CEF无非做两件事:1.把路由表中条目进行优化,加入FIB:2.把A ...

  4. 数据分析之numpy模块

    numpy(numerical python)是python语言的一个扩展程序库,支持大量的维度数组和矩阵运算,此外也针对数组提供大量的数学函数库. 一.创建数组 1 使用array()创建 impo ...

  5. 【转载】To the Virgins, to Make Much of Time

    Gather ye rosebuds while ye may Old Time is still a-flying And this same flower that smiles today To ...

  6. WEB页获取串口数据

    最近做一个B/S的项目,需要读取电子秤的值,之前一直没做过,也没有经验,于是在网上找到很多  大致分两种 使用ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制 使用C#语言 ...

  7. CentOS 7 安装 .Net Core 2.0 详细步骤

    轰轰烈烈的Core 热潮,从部署环境开始.参照了网上不少前辈的教程,也遇到不少的坑,这边做个完整的笔记. 一.构建.Net core 2的应用程web发布,因为是用来测试centos上的core 环境 ...

  8. Class<?> getClass()

    getClass()方法属于Object的一部分,它将产生对象的类,并且在打印该类时,可以看到该类类型的编码字符串,前导"["表示这是一个后满紧随的类型的数组,而紧随的" ...

  9. 小程序webview应用实践

    原文:小程序webview实践 作者:张所勇(转转开放业务部前端负责人) 公众号:大转转FE Fundebug经授权转载,版权归原作者所有. 大家好,我是转转开放业务部前端负责人张所勇,今天主要来跟大 ...

  10. 洛谷P2447 [SDOI2010]外星千足虫(异或方程组)

    题意 题目链接 Sol 异或高斯消元的板子题. bitset优化一下,复杂度\(O(\frac{nm}{32})\) 找最优解可以考虑高斯消元的过程,因为异或的特殊性质,每次向下找的时候找到第一个1然 ...