详解 lParam 参数信息

转载 2012年03月26日 19:59:55
WM_SYSKEYDOWN等按键:详解 lParam 参数信息
2011-05-23 10:34

lParam的32位分为6个字段,如图6-1所示。

 

图一 lParam变量的6个按键消息字段

重复计数

重复计数是该消息所表示的按键次数,大多数情况下,重复计数设定为1。不过,如果按下一个键之后,您的窗口消息处理程序不够快,以致不能处理自动重复速率(您可以在「控制台」的「键盘」中进行设定)下的按键消息,Windows就把几个WM_KEYDOWN或者WM_SYSKEYDOWN消息组合到单个消息中,并相应地增加重复计数。WM_KEYUP或WM_SYSKEYUP消息的重复计数总是为1。

因为重复计数大于1指示按键速率大于您程序的处理能力,所以您也可能想在处理键盘消息时忽略重复计数。几乎每个人都有文书处理或执行电子表格时画面卷过头的经验,因为多余的按键堆满了键盘缓冲区,所以当程序用一些时间来处理每一次按键时,如果忽略您程序中的重复计数,就能够解决此问题。不过,有时可能也会用到重复计数,您应该尝试使用两种方法执行程序,并从中找出一种较好的方法。

OEM扫描码

OEM扫描码是由硬件(键盘)产生的代码。这对中古时代的汇编程序写作者来说应该很熟悉,它是从PC相容机种的ROM BIOS服务中所获得的值(OEM指的是PC的原始设备制造商(Original Equipment Manufacturer)及其与「IBM标准」同步的内容)。在此我们不需要更多的信息。除非需要依赖实际键盘布局的样貌,不然Windows程序可以忽略掉几乎所有的OEM扫描码信息。

扩充键旗标

如果按键结果来自IBM增强键盘的附加键之一,那么扩充键旗标为1(IBM增强型键盘有101或102个键。功能键在键盘顶端,光标移动键从数字键盘中分离出来,但在数字键盘上还保留有光标移动键的功能)。对键盘右端的Alt和Ctrl键,以及不是数字键盘那部分的光标移动键(包括Insert和Delete键)、数字键盘上的斜线(/)和Enter键以及Num Lock键等,此旗标均被设定为1。Windows程序通常忽略扩充键旗标。

内容代码

右按键时,假如同时压下ALT键,那么内容代码为1。对WM_SYSKEYUP与WM_SYSKEYDOWN而言,此位总视为1;而对WM_SYSKEYUP与WM_KEYDOW消息而言,此位为0。除了两个之外:

如果活动窗口最小化了,则它没有输入焦点。这时候所有的按键都会产生WM_SYSKEYUP和WM_SYSKEYDOWN消息。如果Alt键未被按下,则内容代码字段被设定为0。Windows使用WM_SYSKEYUP和WM_SYSKEYDOWN消息,从而使最小化了的活动窗口不处理这些按键。
  对于一些外国语文(非英文)键盘,有些字符是通过Shift、Ctrl或者Alt键与其它键相组合而产生的。这时内容代码为1,但是此消息并非系统按键消息。
 

键的先前状态

如果在此之前键是释放的,则键的先前状态为0,否则为1。对WM_KEYUP或者WM_SYSKEYUP消息,它总是设定为1;但是对WM_KEYDOWN或者WM_SYSKEYDOWN消息,此位可以为0,也可以为1。如果为1,则表示该键是自动重复功能所产生的第二个或者后续消息。

转换状态

如果键正被按下,则转换状态为0;如果键正被释放,则转换状态为1。对WM_KEYDOWN或者WM_SYSKEYDOWN消息,此字段为0;对WM_KEYUP或者WM_SYSKEYUP消息,此字段为1。

位移状态

在处理按键消息时,您可能需要知道是否按下了位移键(Shift、Ctrl和Alt)或开关键(Caps Lock、Num Lock和Scroll Lock)。通过呼叫GetKeyState函数,您就能获得此信息。例如:

iState = GetKeyState (VK_SHIFT) ;

如果按下了Shift,则iState值为负(即设定了最高位置位)。如果Caps Lock键打开,则从

iState = GetKeyState (VK_CAPITAL) ;

传回的值低位被设为1。此位与键盘上的小灯保持一致。

通常,您在使用GetKeyState时,会带有虚拟键码VK_SHIFT、VK_CONTROL和VK_MENU(在说明Alt键时呼叫)。使用GetKeyState时,您也可以用下面的标识符来确定按下的Shift、Ctrl或Alt键是左边的还是右边的:VK_LSHIFT、VK_RSHIFT、VK_LCONTROL、VK_RCONTROL、VK_LMENU、VK_RMENU。这些标识符只用于GetKeyState和GetAsyncKeyState(下面将详细说明)。

使用虚拟键码VK_LBUTTON、VK_RBUTTON和VK_MBUTTON,您也可以获得鼠标键的状态。不过,大多数需要监视鼠标键与按键相组合的Windows应用程序都使用其它方法来做到这一点-即在接收到鼠标消息时检查按键。实际上,位移状态信息包含在鼠标信息中,正如您在下一章中将看到的一样。

请注意GetKeyState的使用,它并非实时检查键盘状态,而只是检查直到目前为止正在处理的消息的键盘状态。多数情况下,这正符合您的要求。如果您需要确定使用者是否按下了Shift-Tab,请在处理Tab键的WM_KEYDOWN消息时呼叫GetKeyState,带有参数VK_SHIFT。如果GetKeyState传回的值为负,那么您就知道在按下Tab键之前按下了Shift键。并且,如果在您开始处理Tab键之前,已经释放了Shift键也没有关系。您知道,在按下Tab键的时候Shift键是按下的。

GetKeyState不会让您获得独立于普通键盘消息的键盘信息。例如,您或许想暂停窗口消息处理程序的处理,直到您按下F1功能键为止:

while (GetKeyState (VK_F1) >= 0) ; // WRONG !!!

不要这么做!这将让程序当死(除非在执行此叙述之前早就从消息队列中接收到了F1的WM_KEYDOWN)。如果您确实需要知道目前某键的状态,那么您可以使用GetAsyncKeyState。


原文地址:http://hi.baidu.com/abcd5677458/blog/item/24b1eccab8964791c8176840.html

Wparam与Lparam的区别

在Win32 SDK中消息本身是作为一个结构体记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。这个记录类型叫做MSG,它在window中是这样声明的:  typedef struct ...
  • scsyuzujin
  • scsyuzujin
  • 2014年09月29日 16:04
  • 2817

DuiLib 通用窗口类封装

class WindowImplBase : public CWindowWnd, public INotifyUI, public IMessageFilterUI, public IDi...
  • KingRama
  • KingRama
  • 2014年12月08日 12:33
  • 457

获取程序实例:hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;

lParam是操作系统调用你的窗口过程传给你的参数 他根据处理消息的不同含义也会不同 当在处理WM_CREATE消息时 lParam里面保存的是一指针,指向LPCREATESTRUCT结构的地址。 ...
  • human_cn
  • human_cn
  • 2012年03月31日 17:42
  • 790

MFC——Windows消息及对应wParam,lParam

平时会使用到的Windows消息以及对应的参数信息 准备部分:// 需要使用到的宏 // WinUser.h中 #define MAKEWPARAM(l, h) ((WPARAM)(DWOR...
  • qq_35162107
  • qq_35162107
  • 2017年03月17日 16:24
  • 398

VC++中WPARAM和LPARAM的使用

这两个数据数一样的数据类型 typedef UINT WPARAM; typedef LONG LPARAM; 在Win32 API中,WPARAM和LPARAM都是32位,所以没有什么本质的区...
  • mjzhlstk
  • mjzhlstk
  • 2014年10月12日 14:18
  • 773

MFC 消息中( WPARAM wParam,LPARAM lParam)包含信息 (2014-08-30 09:27:13)

MFC 消息中( WPARAM wParam,LPARAM lParam)包含信息   分类: 操作系统/ Windows/ 文章   windows的消息具有以下两个参数:     (1...
  • sunnyli3166
  • sunnyli3166
  • 2015年08月12日 09:58
  • 458

WPARAM和LPARAM的含义

lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数。 LRESULT CALLBACK WindowProc(HWND hwnd, UINT u...
  • cxq_1993
  • cxq_1993
  • 2015年08月24日 13:55
  • 2395

十三:谈谈MSG中的 WPARAM 和 LPARAM

第一:WPARAM 和 LPARAM 是什么东西         typedef uint wparam;//就是无符号整形         typedef long lparam;//就是长整形  ...
  • ljd_1986413
  • ljd_1986413
  • 2011年03月18日 11:45
  • 8178

无法从“CString”转换为“LPARAM”&nb…

转载地址:http://hi.baidu.com/psdty/item/44d00c096ca2f5036c904820 void CTestDlg::OnClickedButton2() { ...
  • fuyoufang1
  • fuyoufang1
  • 2014年05月06日 17:34
  • 685

消息中的wParam和lParam

具体是这么说:“在Win 3.x中,WPARAM是16位的,而LPARAM是32位的,两者有明显的区别。因为地址通常是32位的,所以LPARAM 被用来传递地址,这个习惯在Win32 API中仍然能够...
  • ahuang1900
  • ahuang1900
  • 2014年08月08日 16:22
  • 1333
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:详解 lParam 参数信息
举报原因:
原因补充:

(最多只允许输入30个字)