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

--

未定义

对话框是不会响应OnChar和OnKeyDown消息的,会被 其它控件拦截

试扒蚂没时发现不会进入这两个函物闭数,必须重定义PreTranslateMessage()虚函数才能正确地进入这两个消春纳息函数,具体实现如下:

BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)

{

SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam)

return 0

//return CDialog::PreTranslateMessage(pMsg)

}

这样,程序就能正确地调用onKeyDown和onChar这两个函数了,且onKeyDown()在onCchar()之前处理的。

这样就能在对话框中响应WM_CHAR、WM_KEYDOWM消息了,注意在发送WM_CHAR时,实际发送了三个消息

即 WM_CHAR

WM_KEYDOWM

WM_KEYUP

所以,如果你有如下代码:

void CMy1Dlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

// TODO: Add your message handler code here and/or call default

if(nChar=='a')

MessageBox("a")

CDialog::OnChar(nChar, nRepCnt, nFlags)

}

会d出两个消息对话框 ,所以最好单独在WM_KEYDOWM或WM_KEYUP处理事件。

没锋扰怎么学Windows。

消息驱动机制给我的印象是:

当用户做出某种动作、或者系统发生某种变化, *** 作系统就会自动调用一个消息处理函数并且传递一些描述事件的参数,这个函槐态数就可以执行一些 *** 作来响应这个 *** 作。 消息是由 *** 作系统发出的。 消息这个名词估计就是为了好听和形象吧,面向对象编程把调用一个对象的成员函数的 *** 作称为发送一个消息,发出者这个函数的调用者。

paint消息就是铅基源在窗口需要重新绘制时调用窗口处理过程,并传递标识这个消息的参数。

消息响应就是通过应用程序定义的窗口消息处理函数来响应,也就是说响应那些消息以及如何响应由程序员定义。


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

原文地址: http://outofmemory.cn/yw/12418424.html

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

发表评论

登录后才能评论

评论列表(0条)

保存