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
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消息就是铅基源在窗口需要重新绘制时调用窗口处理过程,并传递标识这个消息的参数。
消息响应就是通过应用程序定义的窗口消息处理函数来响应,也就是说响应那些消息以及如何响应由程序员定义。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)