Windows程序设计零基础自学_6_键盘_之键盘处理基础

       不知道中国的教育怎么了, 前两天发生在我身边的一件事,让我很无语, 同时让我想起了那个经典的“Ctrl+C” 和“Ctrl+V” 的电影片段。

前两天我一个同事电脑操作系统蹦了,需要重装, 然后就叫我帮他弄, 然后我帮他弄了,系统装好后,发现没有硬件驱动, 怎么办? 只能干

着急, 然后我向他解释,现在没有办法给他装驱动, 只能等到公司然后他自己从其他同事那里复制驱动程序(公司给配的的统一的Dell的

E5410本本),然后他自己安装。 突然他想出了一个办法,那就是从我个人的电脑上复制我的电脑上硬件的驱动给他的Dell电脑用( 本人个人

的本本联想的E40,公司配的Dell那天刚好没带回家),我没有笑他,因为我知道这不是他的错(我同事大学毕业)。 听他这么说我知道他自己

根本不可能知道怎么从官网下载驱动了,也不知道该从别的同事复制什么样的驱动程序了, 没有办法我只能又上网从Dell的官网下载驱动给他安

装好驱动,经过这件事,我突然发现,中国的教育,真是悲催啊................................

      我真的是非常以及其特别伤心和无语啊........................................

      我发现我有时候真的和可怜......................

算了不闲扯了, 接着前面windows程序的内容继续说说,上次说到了GDI的一些内容,本来GDI还有些东西的,但基本的原理都说过了,

剩下的是一些系统函数和简单的内容,现在不说了, 以后有机会在补充一点关于GDI的内容吧............   最近有点忙,累的慌,有点懒

哎, 这人啊,怎么说呢? 天生都有懒筋.................

6、 键盘
6.1 键盘基础
    windows程序中,键盘输入以消息的形式传递个程序的窗口消息处理程序。
    在windows下用八种不同的消息来传递不同的键盘事件。在应用程序中可以忽略部分
键盘消息。处理键盘的工作就是识别出那些消息时重要的,那些是不需要响应的。
6.1.1 忽略键盘消息
    键盘是windows程序中使用者的主要输入来源,但是程序不必对所有的消息都作出响应。
windows本身也能处理很多的键盘功能。
    可以忽略系统功能的按键消息,通常系统功能按键用到Alt键。程序不必监视这下按键消息,
windows会将按键的作用通知应用程序。
    虽然呼叫程序菜单的按键将通过窗口的窗口消息处理程序,但通常内定的处理方式是将按键
传递给DefWindosProc, 最终窗口消息处理程序将获得一个消息,表示一个菜单项被选中了。
    应用程序可以使用键盘快捷键来启动通用菜单项。快捷键通常是功能键或字母同Ctrl键的组合。
这些键盘快捷键与程序菜单一起在程序的资源文件中定义,windows会将键盘快捷键转换为菜单命
令消息,而不需要应用程序进行转换。
   对话框也有键盘接口,但是当对话框处于活动状态时,应用程序通常不必监视键盘。键盘接口由
windows处理,windows把关于按键作用的消息发送给应用程序。
6.1.2 焦点
   在windows下,计算机的硬件由操作系统和在windows下执行的所有应用程序共享,有时应用程序
可能有多个窗口,键盘必须由该应用程序的所有窗口共享。
  
   在消息循环中,程序用MSG结构的变量从消息队列中检索应用程序消息。MSG结构体包括hwnd字段,
hwnd字段保存接收消息的控件码,消息循环中DispatchMessage函数向窗口消息处理程序发送该消息,
此窗口消息处理函数与需要消息的窗口相联系,在按下键盘上的键时,只有一个窗口消息处理程序接
收键盘接收键盘消息,并且此消息包括接收消息的控件码。

  接收特定的键盘消息的窗口具有输入焦点。输入焦点的概念与活动窗口的概念很相近。有输入焦点
的窗口是活动窗口或者活动窗口的衍生窗口(活动窗口的子窗口,或者活动窗口子窗口的子窗口)。

  通常很容易辨别活动窗口,它通常是顶层窗口-也就是说她的父窗口句柄是NULL。如果活动窗口有标题
栏,windows将突出显示标题栏。如果活动窗口具有对话框架而不是标题栏,则windows突出显示框架。如
果活动窗口是最小化的,windows将在工作列中突出显示该项,其显示就像一个按下的按钮。

 如果活动窗口有子窗口,那么有输入焦点的窗口既可以是活动窗口,也可以是其子窗口。
 常见子窗口有类似以下的控件:
     1、出现在对话框中的按钮
     2、单选按钮
     3、复选框
     4、滚动条
     5、编辑方块
     6、清单方块
 Tip:
      子窗口不能自己成为活动窗口,只有当子窗口是活动窗口的衍生窗口时,子窗口才能有输入焦点。
      子窗口控件一般通过显示一个闪烁的插入符号或用虚线表示自己具有输入焦点。

  有时输入焦点不在任何窗口中,这种情况发生在所有程序都是最小化的时候。这时windows将继续向
活动窗口发送键盘消息但是这样的消息与发送给非最小话的活动窗口的键盘消息有不同的形式。

  窗口消息处理程序通过拦截WM_SETFOCUS和WM_KILLFOCUS消息来判定它的窗口何时拥有输入焦点.
WM_SETFOCUS指示窗口正在得到输入焦点,WM_KILLFOCUS指示窗口正在失去输入焦点。

6.1.3 队列和同步
   键盘消息的处理过程:
       按下并释放键盘上按键——>windows和键盘驱动程序将硬件扫描码转换为格式消息。
   格式消息不保存在应用程序的消息队列,而是保存在windows维护系统消息队列。

   系统消息队列:
        独立的消息队列,有windows维护,用于初步保存使用者从键盘或者鼠标输入的信息。
        只有当windows应用程序处理完前一个使用者输入消息时,windows才会从系统消息
        队列中取出下一个消息,并将其放入到应用程序队列中。
    两个步骤:
          1) 消息保存在系统消息队列
          2) 将消息从系统消息队列转移到应用程序消息队列
    原因:  需要消息同步
6.1.3 按键和字符
    应用程序接收的关于键盘的事件消息分为:
        1)按键(消息)
        2)字符(消息)
    可以将键盘看做是键的集合。
    Exp:
         A键在键盘上是唯一的, 按键事件: 按下A键和释放A键
    键盘也能产生可显示字符或控制字符。
    Exp:
        根据CapsLock, A可以产生多个字符: 例如'A'  和 'a'

    Tip:
      对产生可显示字符的按键组合,windows不仅给程序发送按键消息,而且还发送字符消息。
      对于不产生字符的按键,例如Shift、功能键、光标移动键和特殊字符键Insert和Delete, 则
      windows只产生按键消息。

6.2 按键消息
    当按下一个键时,windows把WM_KEYDOWN或者WM_SYSKEYDOWN消息放入有输入焦点的窗口的消息队列,
    当释放一个键时,windows把WM_KEYUP或者WM_SYSKEYUP消息放入具有输入焦点的窗口的消息队列。
    Tip:
                             键按下                         键释放
    非系统键            WM_KEYDOWN                     WM_KEYUP
    系统键              WM_SYSKEYDOWN                  WM_SYSKEYUP
  
    通常按下和释放消息时成对出现的;不过按住一个键时会使自动重复功能启动,当最后键被释放时
    windows会发送一系列的WM_KEYDOWN或者WM_SYSKEYDOWN消息和一个WM_KEYUP(或者WM_SYSKEYUP)
    消息。
    同样的按键消息也有时间信息,通过呼叫GetMessageTime函数,可以获得键被按下和释放的相对
    时间。

6.2.1 系统键和非系统键
     WM_SYSKEYDOWN和WM_SYSKEYDOWN中的SYS表示系统, 他表示该按键对windows比对应用程序更加
  重要。
     WM_SYSKEYDOWN和WM_SYSKEYUP消息经常有与Alt相组合的按键产生,这些按键启动程序菜单或者
  系统菜单上的选项,或者拥有切换活动窗口等系统功能。也可用作系统菜单快捷键(Alt键与一个功能
  键相结合,Alt+F4用于关闭应用程序)
     程序通常忽略WM_SYSKEYDOWN和WM_SYSKEYUP消息,并把他们传递给DefWindowProc。
     由于windows要处理所有的Alt键的功能,所以应用程序通常不需要处理这些消息。

    WM_KEYDOWN和WM_KEYUP消息通常是在按下或者不带Alt键的键时产生的,windows不会处理
    这些消息,在应用程序里面可以选择响应或者忽略这些消息。
    对于WM_KEYDOWN   WM_KEYUP   WM_SYSKEYDOWN   WM_SYSKEYUP四类按键消息,wParam是虚
    拟键代码,表示按下或释放的键,而lParam则包含属于按键的其他数据。

你可能感兴趣的:(windows)