关闭

windows键盘

317人阅读 评论(0) 收藏 举报

关于键盘输入: 所有Windows应用程序应该能够从键盘和鼠标 接收用户输入,WIndows应用程序是以处理投递到窗口的消息的形式接收键盘输入的。

        键盘输入方式:Windows系统通过安装与当前键盘相对应的键盘设备驱动程序为应用程序提供设备独立键盘支持,Windows系统还通过使用由当前用户或应用程序选中的语言特有的键盘配置,提供语言独立键盘支持。键盘设备驱动程序从键盘接收的扫描码,被发送到键盘配置。在这里扫描码被翻译成消息并投递到应用程序中相应的窗口。给键盘上的每一个键赋唯一的值称之为扫描码,它是一个键盘键的设备独立标识,在用户敲键时键盘产生两个扫描码——一个是用户在按下键,另一个是在用户释放键。键盘驱动程序截取一个扫描码,并把它翻译(映射)成虚键码,它是由Widnows系统定义的用来标识键的设备独立值。翻译了一个扫描码后,键盘创建一条含有扫描码、虚键码及相关单击键的其它信息的消息,然后再把这条消息放到系统消息队列中。Windows从系统队列中移走这条消息,再把它投递到相应的线程消息队列去。                                                                                                                      键盘(扫描码)——>键盘驱动程序(消息)——>系统消息队列(消息)——>线程消息队列——>线程消息循环——>窗口过程。

        键盘焦点和激活:Windows系统把键盘消息投递到创建具有输入焦点的窗口的线程消息队列中,键盘焦点是窗口的一个临时属性。Windows系统通过移动键盘焦点让显示在屏幕上的所有窗口都能共享键盘,根据用户的意图,可以把键盘焦点从一个窗口移到另外一个窗口。系统将所有的键盘消息发送到具有键盘焦点的窗口的线程消息队列中。一个线程可以调用函数GetFocus来确定它的窗口(如果有的话)当前是否有键盘焦点,线程也可以调用函数SetFocus来把键盘焦点赋给它的窗口之一。但这一般会使用户迷茫。如果键盘从一个窗口改变到另外一个窗口,系统将向失去焦点的窗口发送WM_KILLFOCUS消息,而把WM_SETFOCUS消息发送到即将获得键盘焦点的窗口。键盘焦点的概念与活动窗口紧密相关,活动窗口是用户当前正在使用的顶层窗口。有键盘焦点的窗口可以是活动窗口本身,或者是活动窗口的一个子窗口。所以用户可以很容易地识别活动窗口,系统还要把活动窗口放置在Z次序的顶部,并高亮显示它的标题栏和边框(如果有的话)。我们可以通过函数GetActiveWindow和SetActiveWindow来判断该窗口是否是活动窗口或设置该窗口为活动窗口。如果一个窗口被禁止,而另一个窗口被激活,Windows将把WM_ACTIVATE消息发送到将要被禁止的窗口,然后再发送WM_ACTIVATE到将要激活的窗口。WM_ACTIVATE的wParam参数的低字位是0则标识该窗口将要被激活。如果wParam参数的低字位为1这标识将要禁止。默认情况下,一个窗口变成活动窗口,系统就把键盘焦点设置到该窗口。

        击键消息:按下一个键就会产生一条WM_KEYDOWN或WM_SYSKEYDOWN消息,并将消息投递到具有键盘焦点的窗口的线程消息列队中。释放一个键则会产生一条WM_KEYUP或WM_SYSKEYUP消息,同样也会投递到消息队列中。如果用户在一定时间后一直按键不放,则系统将启动键盘的自动重复特性,这时系统将产生一系列的WM_KEYDOWN或WM_SYSKEYDOWN消息。但始终只会在释放键时产生一条WM_KEYUP或WM_SYSKEYUP消息。

       系统击键消息和非系统击键消息:Windows对系统击键和非系统击键分别产生WM_SYSKEYDOWN和WM_SYSKEYUP消息,而非系统击键产生WM_KEYDOWN和WM_KEYUP。如果窗口处理系统击键消息,则必须在处理了这条消息之后还得把它传送给DefWindowProc函数。否则,所有的系统操作包括ALT键将被禁止,也就是说,用户不能得到窗口菜单或System菜单,或者用ALT+ESC或ALT+TAB组合键来激活另一个窗口。系统击键消息主要是用于系统而不是应用程序,Windows系统用它们来给菜单提供内部键盘接口,以便用户控制要激活哪一个窗口。系统击键消息是在用户使用一个ALT组合键时,或者是用户敲击键,但没有窗口具有键盘焦点(如,所有应用程序窗口都被最小化),在这种情况下,消息就会被投递到与活动窗口相应的消息队列中。非系统击键消息是用于应用程序窗口,函数DefWindowProc不处理这类消息,窗口过程将丢弃任何不处理非系统击键消息。

        虚键码:击键消息的wParam参数含有一个被按过或被释放键的虚键码,窗口过程是根据虚键码的值决定是处理还是忽略某条击键消息的。一个典型的窗口过程处理击键消息只是它接收的击键消息的一个很小的子集,其余的则被忽略了。

      扫描码:是用户按一个键时有键盘硬件产生的一个值,它是用来标识键被按过的一个设备相关值,而不是键所代表的字符。应用程序通常是不处理扫描码的,而是用设备独立虚键码来翻译击键消息。

      字符消息:击键消息提供了许多有关击键消息,但并不提供字符击键的字符码,要检取字符码,应用程序必须在它的线程消息环中含有函数TranslateMessage。TranslateMessage把WM_KEYDOWN或WM_SYSKEYDOWN消息传给键盘处理例程,有处理例程检查消息的虚键码,如果对应的是一个字符键,就提供相应的字符码(同时考虑SHIFT和CAPS LOCK键的状态),再产生一条含有字符码的字符消息放在消息队列的开始。消息环下一次循环从列队中移走这条字符消息,并发送到相应的窗口过程。

        窗口能够接收四种不同的字符消息,包括WM_CHAR、WM_DEADCHAR、WM_SYSCHAR和WM_SYSDEADCHAR消息,函数TranslateMessage在处理WM_KEYDOWN消息时产生WM_CHAR或WM_DEADCHAR消息。同样,在它处理WM_SYSKEYDOWN消息时,产生WM_SYSCHAR或WM_SYSDEADCHAR消息。一般应用程序只处理WM_CHAR消息,而把其它的消息都传给函数DefWindowProc。Windows系统用WM_SYSCHAR和WM_SYSDEADCHAR实现菜单别名。所有的字符消息的wParam参数含有被按过的字符键的字符码,这个字符码的值取决与接收消息的窗口的窗口类。如果是用函数RegisterWindowClass的Unicode版本,则系统就给这种窗口类的所有窗口提供Unicode字符,否则提供ASC11码。有些非标准键盘可能含有一些不是用来产生它们字符本身,而是用于给下一个击键添加一个变调符号,这些键称之为固定键(例如,德文键盘上的音调符号)。当按下固定键,则产生WM_DEADCHAR。如果按下的是一个与ALT组合的固定键,则产生WM_SYSDEADDOWN消息。应用程序可以通过函数GetKeyNameText从设备驱动程序中检取任意一个键的名字。

        热键的支持:Windows系统提供了一些应用程序可用来定义热键的函数,热键是产生WM_HOTKEY消息的组合键,这些消息绕过线程消息队列中所有其它的消息被放置在最前面。应用程序使用热键从用户得到高优先级的输入。例如,CTRL+C是一个拷贝操作的热键。要定义一个热键,应用程序要调用函数RegisterHotKey,指定产生WM_HOTKEY消息的组合键、接收消息的窗口句柄、热键标识。如果用户按下一个热键,一条WM_HOTKEY消息就被放到创建指定窗口的线程消息队列中,消息的wParam参数是热键的标识。应用程序可以为一个线程定义多个热键,但线程中的每一个热键必须是唯一的。在应用程序结束之前,应该用函数UnregisterHotKey销毁热键。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1447834


 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:562次
    • 积分:15
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档
    阅读排行
    评论排行