zoukankan      html  css  js  c++  java
  • 响应键盘消息

    一:首先介绍键盘消息

    系统消息:
        ALT,F1,——F24等,是由系统内部处理的,程序本身就存在,比如F1是帮助键。
        WM_SYSKEYDOWN
        WM_SYSKEYUP
        WM_SYSCHAR
    非系统消息:
        是由我们自己加上去的,
        WM_KEYDOWN
        WM_KEYUP
        WM_CHAR

    二、添加消息

    (一般WM_KEYDOWN),在消息响应函数

    OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

    有三个变量,nChar这是虚拟键代码,另外两个不常用,用时参看MSDN。

    如果要响应组合键,可以用GetAsyncKeyState()检测按键状态

    如:
    case VK_UP:
    if (GetAsyncKeyState(VK_LSHIFT))
    {
    // 左shift+up
    }
    break;
     三:OnKeyDown不响应的原因
        只是这个消息在到达窗体之前,已经被它的子控件捕获了,如果将窗体中的所有控件都删除,窗体就会捕获到这个消息,但要注意的是,MFC为了实现在窗体上切换子控件的焦点,已经将 VK_TAB,VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN进行了处理,同时VK_RETURN也被系统捕获用来处理相应的确定事件,所以即使窗体中没控件,这几个键还是无法捕获
        也就是说,一个窗体仅在它没有可视和有效的控件时,才能响应OnKeyDown

    四:具体的解决方法(按键响应方法
        可以调用窗体的PreTranslateMessage函数来实现,具体代码如下:
    BOOL CMeetingDlg::PreTranslateMessage(MSG* pMsg)
    {
    if (pMsg->message==WM_KEYDOWN)
    {
       switch (pMsg->wParam)
       {
       case VK_F1:
        if (::GetKeyState(VK_CONTROL)<0)
        {
         AfxMessageBox("ss");
        }
        break;
       case VK_F2:
        if (::GetKeyState(VK_CONTROL)<0)
        {
         AfxMessageBox("ss");
        }
        break;
       }
       
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
    ***********************************************************************************

    在MFC(Microsoft Foundation Class)对响应消息进行了封装,

    可以通过重载虚函数PreTranslateMessage()对所关心的消息进行截取与响应:

    以下对截取与响应键盘 Enter 消息的截取与响应

    这是对话框的响应键盘 Enter 消息方式:
    BOOL C**Dlg::PreTranslateMessage(MSG* pMsg)
    {
       //判断是否为键盘消息
       if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)
       {
          //判断是否按下键盘Enter键
          if(pMsg->wParam==VK_RETURN)
          {

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

    这是View视图类响应键盘 Enter 消息的方式:

    BOOL C**View::PreTranslateMessage(MSG* pMsg)
    {
     if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)
     {
      if(pMsg->wParam==VK_RETURN )
      {

            return TRUE;

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

      在上面的代码中,首先将pMsg->message所表示的消息同WM_KEYFIRST 和WM_KEYLAST比较,确定是键盘消息,然后通过消息参数pMsg->wParam的值来判断是否是回车键(VK_RETURN,虚拟键码可以下面相关资料中查到)。

    keybd_event Function

    Synthesizes a keystroke. The system can use such a synthesized keystroke to generate a WM_KEYUP or WM_KEYDOWN message. The keyboard driver's interrupt handler calls the keybd_event function.

    Note This function has been superseded. Use SendInput instead.
    貌似已经被SendInput取代了,呵呵,改天再研究吧。
  • 相关阅读:
    RMAN主要命令 show,list,crosscheck,delete详解
    CentOS6.2上安装Oracle10g报ins_emdb.mk错误处理方法
    CentOS 6.3(x86_32)下安装Oracle 10g R2
    关于约束ENABLE NOVALIDATE的一个疑问
    mongodb drop不释放磁盘空间
    Drop a database in MongoDB
    linux 中使用iptables 防止ddocs及cc攻击配置 。
    MySQL用Load Data local infile 导入部分数据后中文乱码
    微信小程序开发:学习笔记[7]——理解小程序的宿主环境
    软考解析:2016年下半年下午试卷
  • 原文地址:https://www.cnblogs.com/BeyondTechnology/p/1966083.html
Copyright © 2011-2022 走看看