C++捕获组合键

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);
}

时间: 2024-08-28 08:27:52

C++捕获组合键的相关文章

MFC 对话框Dialog响应键盘事件(组合键Ctrl+A)

在上一篇文章的基础上,这里描述如何捕获组合键,这里以Ctrl+A为例 做法就是按下Ctrl的时候用一个静态成员变量保存Ctrl是否被按下,当Ctrl按下的时候设置为true:当Ctrl键抬起的时候设置为false 其他组合键的开发用此例举一反三即可. 头文件声明 BOOL PreTranslateMessage(MSG* pMsg); 源文件定义 BOOL CmfcDlg::PreTranslateMessage(MSG* pMsg) { static bool m_ctrl_down = fa

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

Shift 是一个集合变量. type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble); 也就是说TShiftstate类型有ssShift, ssAlt, ssCtrl, ssLeft(鼠标左键), ssRight(鼠标右键), ssMiddle(鼠标中键), ssDouble (鼠标双击) Value Meaning ssShift The Shift key is held

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

Shift 是一个集合变量. type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble); 也就是说TShiftstate类型有ssShift, ssAlt, ssCtrl, ssLeft(鼠标左键), ssRight(鼠标右键), ssMiddle(鼠标中键), ssDouble (鼠标双击) Value Meaning ssShift              The Shif

关于PostMessage后台发送组合键

PostMessage发送组合键,我实验过几次,都失败 比如下面这些语句发送ALT+V, 根本无法发送成功 PostMessage(hWnd,WM_SYSKEYDOWN,VK_MENU,0); PostMessage(hWnd,WM_SYSKEYDOWN,VK_V,0); Sleep(50); PostMessage(hWnd,WM_SYSKEYUP,VK_V,0); PostMessage(hWnd,WM_SYSKEYUP,VK_MENU,0); 后来我使用了spy++, 提出消息列表里捕获到

Windows+X组合键失效问题

有时候,生活总给你带来点出其不意的乐趣,比如今天的[Windows+X组合键失效],网上找了很多教程,修改注册表等等,均无效. 博主在使用Win7.10.甚至8的时候居然都遇到这问题了,中间间隔时间很长,所以一般会忘记了上次是怎么解决的.对于一个一贯遵循能用键盘搞定的坚决不用鼠标的装X爱好者来说,简直是一场灾难. 现解决方法如下,Win10,Win7亲测有效: 开始->运行->gpedit.msc命令->用户配置->管理模板->Windows组件->文件资源管理器(有些

利用原生JS判断组合键

<script type="text/javascript"> var isAlt = 0; var isEnt = 0; document.onkeydown = function(e){ var evn = e||event; var code = evn.keyCode||evn.which||evn.charCode; if(code==13){ isEnt = 1; } if(code==18){ isAlt = 1; } // 判读Alt+Enter组合键 if

eclipse中代码格式化组合键失效了

因为最近在整理java笔记,发现代码格式化的组合键失效了,但其他的组合键是好着的,设置里面找了也是对着的. 最后是在输入法的设置里面发现了它,原来是快捷键冲突了.取消输入法里面 的快捷键就好了,或者改掉也行.

C# 依据KeyEventArgs与组合键字符串相互转换

/// 快捷键相关的类 /// </summary> public static class HotKeyInfo { /// <summary> /// 依据KeyEventArgs生成组合键字符串 /// </summary> /// <param name="e"></param> /// <returns></returns> public static string GetStringByKe

bash默认组合键,通配符及特殊符号

看鸟哥Linux私房菜中介绍的linux命令太多了,看一遍打一遍还是记不住,鉴于目前是在Windows下工作,又对于Linux系统的爱好,所以之后装了虚拟机在玩,由于本人比较笨,看一遍跟着书敲一遍还是记不住,所以就在此练练手,回忆一下看的内容,重新敲一遍加强记忆. 1.bash默认组合键: Ctrl+C ----------->终止目前的命令 Ctrl+D ----------->输入结束(EOF),例如邮件结束的时候 Ctrl+M ----------->就是Enter Ctrl+S