C++应用程序如何响应键盘消息

C++应用程序如何响应键盘消息,第1张

在microsoft

windows

中,键盘和鼠标是两个标准的用户输入源,在一些交叠的 *** 作中通常相互补充使用。当然,鼠标在今天的应用程序中比10年前使用得更为广泛。甚至在一些应用程序中,我们更习惯于使用鼠标,例如在游戏、画图程序、音乐程序,以及web创览器等程序中就是这样。然而,我们可以不使用鼠标,但绝对不能从一般的pc中拆掉键盘。

相对于个人计算机的其他组件,键盘有非常久远的历史,它起源于1874年的第一台remington打字机。早期饥渗搜的计算机程序员用键盘在hollerith卡片上打孔,以后在哑终端上用键盘直接与大型主机通讯。pc上的键盘在某些方面进行了扩展,包括了功能键、光标定位键和(通常都带有的)单独的数字键盘,但它们的输入原理基本相同。

键盘基础

windows程序获得键盘输入的方式:键盘输入以消息的形式传递给程序的窗口过程。实际上,第一次学习消息时,键盘就是一个明显的例子:消息应该传递给应用程序的信息类型。

windows用8种不同的消息来传递不同的键盘事件。这好像太多了,但是(就像我们所看到的一样)程序可以忽略其中至少一半的消息而不会有任何问题。并且,在大多数情况下,这些消息中包含的键盘信息会多于程烂历序所需要的。处理键盘的部分工作就是识别出哪些消息是重要的,哪些是不重要的。

一、键盘基础知识

虽然应用程序在很多情况下可以通过鼠标实现信息的输入,但到现在为止键盘仍然是pc机中不可替代的重要输入设备。

用键盘当作输入设备,每当用户按下或释放某一个键时,会产生一个中断,该中断激活键盘驱动程序keyboard.drv来对键盘中断进行处理。keyboard.drv程序会根据用户的不同 *** 作进行编码,然后调用windows用户模块user.exe生成键盘消息喊李,并将该消息发送到消息队列中等候处理。

1.扫描码和虚拟码

扫描码对应着键盘上的不同键,每一个键被按下或释放时,都会产生一个唯一的扫描码作为本身的标识。扫描码依赖于具体的硬件设备,即当相同的键被按下或释放时,在不同的机器上可能产生不同的扫描码。在程序中通常使用由windows系统定义的与具体设备无关的虚拟码。在击键产生扫描码的同时,键盘驱动程序keyboard.drv截取键的扫描码,然后将其翻译成对应的虚拟码,再将扫描码和虚拟码一齐编码形成键盘消息。所以,最后发送到消息队列的键盘消息中,既包含了扫描码又包含了虚拟码。

经常使用的虚拟码在windows.h文件中定义,常用虚拟码的数值、常量符号和含义如表所示。

取值(16进制)

常量符号

含义

01

vk_lbutton

鼠标左键

02

vk_rbutton

鼠标右键

03

vk_cancel

break中断键

04

vk_mbutton

鼠标中键

05-07

--

未定义

08

vk_back

(backspace)键

09

vk_tab

tab键

0a-0b

--

未定义

0c

vk_clear

clear键

0d

vk_return

enter键

0e-0f

--

未定义

10

vk_shift

shift键

11

vk_control

ctrl键

12

vk_menu

alt键

13

vk_pause

pause键

14

vk_captial

capslock键

15-19

--

汉字系统保留

1a

--

未定义

1b

vk_escape

esc键

1c-1f

--

汉字系统保留

20

vk_space

空格键

21

vk_prior

pageup键

22

vk_next

pagedown键

23

vk_end

end键

24

vk_home

home键

25

vk_left

←(left

arrow)键

26

vk_up

↑(up

arrow)键

27

vk_right

→(right

arrow)键

28

vk_down

↓(down

arrow)键

29

vk_select

select键

2a

--

oem保留

2b

vk_execute

execute键

2c

vk_snapshot

print

screen键

2d

vk_insert

insert键

2e

vk_delete

delete键

2f

vk_help

help键

30-39

vk_0-vk_9

数字键0-9

3a-40

--

未定义

41-5a

vk_a-vk_z

字母键a-z

5b-5f

--

未定义

60-69

vk_numpad0-vk_numpad9

小键盘数字键0-9

6a

vk_multiply

*(乘号)键

6b

vk_add

+(加号)键

6c

vk_sepapator

分隔符键

6e

vk_subtract

-(减号)键

6f

vk_decimal

.(小数点)键

70-87

vk_divide

/(除号)键

88-8f

vk_f1-vk_f24

f1-f24功能键

90

vk_numberlock

number

lock键

91

vk_scroll

scroll

lock键

92-b9

--

未定义

ba-c0

--

oem保留

c1-da

--

未定义

db_e4

--

oem保留

e5

--

未定义

e6

--

oem保留

e7-e8

--

未定义

e9-f5

--

oem保留

f6-fe

--

未定义

WM_KEYDOWN

当一个非系统键被按下时该消息发送给具有键盘焦点的窗口。非系统键即不与ALT联用的情况。

其中wParam 指定非系统键的虚拟键码, lParam 指定重复次数,扫描码,扩展键标识符,上下文代码,前一键状态标识符,以及转换状态标识符。

它们如下所示:

0-15

指定当前消息重复的次数。该值代表按键敲击敏凯姿的次数,就如同用户一直按下键盘按键一样。如果按键足够长,会发送多个消息。然而,重复次数不进行累加。

16-23

指定扫描码。该值取决于OEM。

24

指定键是否为扩展键,就如同101或102键盘内孙岩的右手的ATL和CTRL键。如果是一个扩展键,则该值是1,否则,它是0.

25-28

保留,未使用。

29

指定上下文代码,对于WM_KEYDOWN消息,该值总是0.

30

指定之前的键状态。如果在消息发送之前,键被按下,则该值是1,否则该值是0.

31

指定转换状态。对于WM_KEYDOWN消息,该值总是0.

返回值桥绝

应用程序如果处理了该消息,则返回值是0.

响应 WM_KEYDOWN 消息,判断VK_SHIFT 和 VK_CONTROL。在MFC中是重载OnKeyDown函数,见下面代码

void CTestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

 if (nChar == VK_SHIFT)

   AfxMessageBox(_T("Shift"))

 else if (nChar == VK_CONTROL)

   AfxMessageBox(_T("Ctrl"))

 CView::OnKeyDown(nChar, nRepCnt, nFlags)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8259063.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存