windows程序设计_第6章_键盘——学习笔记

来源:互联网 发布:杭创软件 编辑:程序博客网 时间:2024/06/02 20:00

Windows程序设计第6章 键盘

一、键盘基础

1、 忽略键盘

键盘是WINDOWS程序中经常用到的用户输入的主要来源,但是程序没有必要去处理所接收到的每一个键盘消息。在默认情况下,一些系统功能的击键操作会被交付给DefWindowProc函数处理。

2、 焦点

有输入焦点的窗口:接收到键盘事件的窗口。

活动窗口:总是最上层的窗口,他的父窗口句柄是NULL。窗口过程通过捕获WM_SETFOCUS\WM_KILLFOCUS消息来确定自己的窗口是否具有输入焦点。

3、 队列和同步

1) 应用程序消息队列

2) 系统消息队列

3) 二步处理法:先把消息存储在系统消息队列,再把它们发送到应用程序消息队列,原因是需要同步。

4、 击键和字符

1) 键盘事件的消息:击键和字符

2) 按下一个键一个消息,释放一个键又是一个消息

二、击键消息

1、  系统击键和非系统击键

 

键按下

键释放

非系统击键

WM_KEYDOWN

WM_KEYUP

系统击键

WM_SYSKEYDOWN

WM_SYSKEYUP

   几乎所有影响程序窗口的消息都将先经过窗口过程。仅当应用程序传递消息给DefWindowProc函数时,Windows才会处理这些消息。

   以上四类击键操作,wParam是虚拟键代码,用于标识哪个键被按下或被释放,而lParam包含属于本次击键的一些其他数据。

2、   虚拟键代码

    大多数的虚拟键代码以VK_开头,可查表。

3、  lParam信息

 


31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

扩展键标记

8位OEM扫描码

键的先前状态

内容代码

转换状态

16位重复计数


 

4、  转义状态

1) 通过调用GetKeyState函数获取是否有转义键(shift,ctrl,alt)被按下。

该函数的用法:并不实时检查键盘状态,它反映了到目前为止的键盘状态,并包含了正在被处理的键盘消息。它无法让你获得独立于标准键盘消息的键盘信息。

2) GetKeyState和GetAsyncKeyState的区别

GetAsyncKeyState:在按下某个键的同时被调用,判断正在按下某键

GetKeyState:在按过某键之后再调用,它返回最近的键盘消息从线程的队列中移出时的键盘状态,判断刚按过了某键。

三、字符消息

1、 四类字符消息

 

字符

死字符

消息来源

非系统字符

WM_CHAR

WM_DEADCHAR

WM_KEYDOWN

系统字符

WM_SYSCHAR

WM_SYSDEADCHAR

WM_SYSKEYDOWN

              大多数情况下,windows程序会忽略其他三种字符消息,仅处理WM_CHAR消息。

2、 消息排序

1)输入顺序:按下SHIFT,按下A键,释放A键,再释放SHIFT键。

消息

击键或代码

WM_KEYDOWN

虚拟键代码VK_SHIFT(0X10)

WM_KEYDOWN

“A”的虚拟键代码(0X41)

WM_CHAR

“A”的字符编码(0X41)

WM_KEYUP

“A”的虚拟键代码(0X41)

WM_KEYUP

虚拟键代码VK_SHIFT(0X10)

2)输入顺序:持续按住A键,然后释放

消息

击键或代码

WM_KEYDOWN

“A”的虚拟键代码(0X41)

WM_CHAR

“a”的字符编码(0X61)

WM_KEYDOWN

“A”的虚拟键代码(0X41)

WM_CHAR

“a”的字符编码(0X61)

WM_KEYDOWN

“A”的虚拟键代码(0X41)

WM_CHAR

“a”的字符编码(0X61)

WM_KEYUP

“A”的虚拟键代码(0X41)

 

3、 控制字符的处理

1) 基本规则:如果需要读取输入到窗口中的键盘字符,就处理WM_CHAR消息,如果需要读取光标键、功能键、DELETE键、INSERT键、SHIFT键、CTRL键、ALT键,则处理WM_KEYDOWN消息。另外TAB键、回车键、ESC键、空格键可以看作控制字符,而不是虚拟键。

四、插入符号(不是光标)

1、 插入符号:指示输入的下一个字符将出现在屏幕上的位置。

光标:表示鼠标位置的位图图像,即鼠标指针。

2、 基本插入符号函数

函数

功能

CreateCaret

创建和窗口关联的插入符号

SetCaretPos

设置窗口内的插入符号位置

ShowCaret

显示插入符号

HideCaret

隐藏插入符号

DestroyCaret

销毁插入符号

GetCaretPos

获得当前插入符号位置

GetCaretBlinkTime

获得插入符号闪烁时间

SetCaretBlinkTime

设置插入符号闪烁时间

 

3、 插入符号的使用规则

在窗口过程处理WM_SETFOCUS消息时调用CreateCaret函数,处理WM_KILLFOCUS消息时调用DestroyCaret 函数。