一、热键注册

步骤一:声明一个全局量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. springboot aop 自定义注解方式实现完善日志记录(完整源码)

    版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型 ...

  2. MySQL多表查询练习题

    一.准备数据 #创建表及插入记录 CREATE TABLE class ( cid ) NOT NULL AUTO_INCREMENT, caption ) NOT NULL, PRIMARY KEY ...

  3. Umbraco 资源推荐

    Umbraco 社区 Umbraco 官方社区.找到人们谈论当前的 Umbraco 主题的最好方法是通过 Twitter.Umbraco 也知道他们很多的聚会和节日在世界各地举行.Umbraco 的开 ...

  4. 关于toggle事件委托的处理

    当html页面加载后,页面上需要再次动态加载的按钮等事件的绑定,我们有两种处理方案 一.再次加载后进行绑定 二.使用委托进行绑定 而toggle事件是无法直接绑定的,这时可以转化为click的事件,并 ...

  5. asp.net mvc之自定义WebViewPage

    采用Razor引擎的View文件最终都会编译成一个WebViewPage类型, 通过自定义WebViewPage,添加相应的属性和方法,你可以很方便的在View里调用, 自定义WebViewPage只 ...

  6. JQuery实现省市区的三级联动

    JQuery实现省市区的三级联动 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "h ...

  7. vue按需引入element或mint

    vue按需引入element或mint需要添加 babel-preset-es2015 和babel-plugin-component

  8. maven 如何依赖工程项目里面的 jar 包

    前言:现在有个 jar 包在私服和公共仓库里面都没有,需要自己将 jar 包放在工程里,然后让 maven 依赖. 这里举个栗子 项目路径: pom.xml 配置 <!--自定义查询组件的jar ...

  9. linux shell脚本之-变量极速入门与进阶(1)

    1,如果创建shell脚本? 使用任意文本编辑软件,一般为vim,创建.sh结尾的文件,在文件的最开头用 #!/bin/bash 注明shell的类型 如: ghostwu@dev:~/linux/s ...

  10. 微信服务号获取openid方法

    public function tetst(){ if(!isset($_GET['code'])){ $APPID = $this->app_id; $ran = rand(1,100); / ...