zoukankan      html  css  js  c++  java
  • VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)

    基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键;同时由于对话框上可能有很多控件,且默认情况下这些子窗口已经截获了焦点,因此键盘消息已经被控件捕获了;同时为了实现控件焦点切换和对话框默认行为,  VK_TAB、VK_LEFT、VK_RIGHT、VK_UP、VK_DOWN、 VK_RETURN、VK_ESCAPE 等键已经被截获处理,因此对话框没有控件时仍然不能完全响应按键消息。

        关于热键的响应请参考这篇文章:Keyboard messages/accelerators handling in MFC dialog based applications
     
        那么我们怎么让对话框程序响应按键消息呢?答案就是重载PreTranslateMessage,在其中截获键盘消息进行处理。
        与按键相关的消息大概有4个:WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP,需要说明的包括以下几点:
        1、KEY与SYSKEY消息的区别在于:如果某个按键动作的同时,ALT键或F10键被按下,则发送SYSKEY消息,否则发送KEY消息;
        2、某个按键动作依次产生WM_KEYDOWN和WM_KEYUP消息;
        3、一个按键一直按着不放,会按一定间隔时间不断发送WM_KEYDOWN消息;
        4、单键动作最好响应WM_KEYUP,组合键动作响应WM_KEYDOWN或WM_SYSKEYDOWN;
        关于几个按键消息的具体解释,请参考MSDN。
     
        以下是一个响应单键消息的示例代码:
    BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)   
    
    {
    
    if(pMsg->message == WM_KEYUP) 
    
    {
    
    // 响应keyup消息
    
    if(pMsg->wParam == VK_RETURN)
    
    {
    
    // 回车
    
    }
    
    }
    
    return CDialog::PreTranslateMessage(pMsg); 
    
    }
     
        那么怎样判断组合键呢?使用GetKeyState函数。示例代码如下:
    BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)   
    
    {
    
    if(pMsg->message == WM_KEYDOWN)
    
    {
    
    // 组合键响应keydown消息
    
    if( pMsg->wParam == VK_SPACE&& (GetKeyState(VK_SHIFT)& 0x8000))
    
    {
    
    // 空格 + Shift
    
    }
    
    }
    
    else if(pMsg->message == WM_SYSKEYDOWN)
    
    {
    
    // Alt组合键响应syskeydown消息
    
    if( pMsg->wParam == 'A'&& (HIWORD(pMsg->lParam) & KF_ALTDOWN))
    
    {
    
    // A + Alt
    
    }
    
    }
    
     
    
    return CDialog::PreTranslateMessage(pMsg); 
    
    }
     
        另外,还有GetAsyncKeyState和GetKeyboardState等类似函数,涉及到逻辑按键和物理按键值等问题,大家可以参考MSDN的说明。
  • 相关阅读:
    C#实现程序的版本升级更新
    c#获取系统内存等信息
    C# 时间格式设置
    SMS(System Management Server)学习笔记。
    C#调用WMI获取本机MAC地址列表。
    sharepoint portal service 一处隐蔽应用。
    ubuntu安装显卡驱动后亮度不能调节问题
    linux下boost编译及链接到系统目录
    在windows下修改右键菜单以实现使用vs2010快速编译代码
    vs2010使用boost::interpocess编译出错
  • 原文地址:https://www.cnblogs.com/lujin49/p/4934978.html
Copyright © 2011-2022 走看看