C++添加热键和捕获组合键
一、热键注册
步骤一:声明一个全局量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++添加热键和捕获组合键的更多相关文章
- Android 捕获组合键
android中捕获组合键http://blog.csdn.net/wenlibin1985/article/details/5579359 Android组合键http://www.eoeandro ...
- C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown事件之间的区别 (附KeyChar/KeyCode值)
1. 首先将窗口属性KeyPreview设为true,如果属性对话框中找不到,就直接在代码里添加: 2. 添加KeyPress / KeyDown事件: 1.KeyPress 和KeyDown .Ke ...
- [转]Delphi : keydown与keypress的区别,组合键
Shift 是一个集合变量. type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDoubl ...
- Delphi : keydown与keypress的区别,组合键
Shift 是一个集合变量. type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDoubl ...
- Hotkeys.js 2.0.2 发布,捕获键盘输入和输入的组合键快捷键,它没有依赖
这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb),gzip:1.9k. 更新内容: 添加测试用例: 添加更多特殊键支持: 修复bug. __ ...
- Hotkeys.js 2.0.2 发布,JS 网页快捷键设置,捕获键盘输入和输入的组合键快捷键,它没有依赖
这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb),gzip:1.9k. 更新内容: 添加测试用例: 添加更多特殊键支持: 修复bug. __ ...
- js简单的设置快捷键,hotkeys捕获键盘键和组合键的输入
设置快捷键 这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb). hotkeys on Githubhotkeys预览 创建 您将需要在您的系 ...
- xcode/Interface Build(IB)/iPhone模拟器/mac/组合键常用的命令集
1.Xcode常用快捷键: win+N:新建文件 win+shift+N:新建工程 win+O:打开工程或文件 win+S:保存 win+shift+S:另存为 win+Z:撤销一步 win+W:关闭 ...
- 关于mfc添加热键
对于mfc的添加热键的文章已经有很多了,我这里就简单的说一下并且说一些可能出的错误 首先在资源文件中添加ACCELERATOR然后在资源文件下的RC中找到ACCELERATOR的节点,打开后可以发现一 ...
随机推荐
- springboot aop 自定义注解方式实现完善日志记录(完整源码)
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者.原文超链接 一:功能简介 本文主要记录如何使用aop切面的方式来实现日志记录功能. 主要记录的信息有: 操作人,方法名,参数,运行时间,操作类型 ...
- MySQL多表查询练习题
一.准备数据 #创建表及插入记录 CREATE TABLE class ( cid ) NOT NULL AUTO_INCREMENT, caption ) NOT NULL, PRIMARY KEY ...
- Umbraco 资源推荐
Umbraco 社区 Umbraco 官方社区.找到人们谈论当前的 Umbraco 主题的最好方法是通过 Twitter.Umbraco 也知道他们很多的聚会和节日在世界各地举行.Umbraco 的开 ...
- 关于toggle事件委托的处理
当html页面加载后,页面上需要再次动态加载的按钮等事件的绑定,我们有两种处理方案 一.再次加载后进行绑定 二.使用委托进行绑定 而toggle事件是无法直接绑定的,这时可以转化为click的事件,并 ...
- asp.net mvc之自定义WebViewPage
采用Razor引擎的View文件最终都会编译成一个WebViewPage类型, 通过自定义WebViewPage,添加相应的属性和方法,你可以很方便的在View里调用, 自定义WebViewPage只 ...
- JQuery实现省市区的三级联动
JQuery实现省市区的三级联动 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "h ...
- vue按需引入element或mint
vue按需引入element或mint需要添加 babel-preset-es2015 和babel-plugin-component
- maven 如何依赖工程项目里面的 jar 包
前言:现在有个 jar 包在私服和公共仓库里面都没有,需要自己将 jar 包放在工程里,然后让 maven 依赖. 这里举个栗子 项目路径: pom.xml 配置 <!--自定义查询组件的jar ...
- linux shell脚本之-变量极速入门与进阶(1)
1,如果创建shell脚本? 使用任意文本编辑软件,一般为vim,创建.sh结尾的文件,在文件的最开头用 #!/bin/bash 注明shell的类型 如: ghostwu@dev:~/linux/s ...
- 微信服务号获取openid方法
public function tetst(){ if(!isset($_GET['code'])){ $APPID = $this->app_id; $ran = rand(1,100); / ...