作为一个低于VB / VBS的业余爱好者(C ++ WINAPI对我的经验来说是个噩梦)我不知道如何在C ++中为一个简单的KEYDOWN消息构建long lParam并且可能花了更多的时间寻找一个不值得的体面解释,有人能够准确地描述如何去做吗?
似乎在其他论坛中几乎每个对这个问题的回答都是“为什么”或“使用SendInput而不是”,而没有真正回答这个问题;我猜这对于人们解释来说太过分了。无论如何这里是msdn的描述,非常感谢一个体面的解释或链接到一个,如果可能的话一个有用的例子:
重复计数,扫描码, 扩展键标志,上下文代码, 以前的键状态标志,和 过渡状态标志,如图所示......
0-15当前的重复计数 信息。值是数字 键击的次数是自动重复的 用户按住的结果 键。如果按键保持很长时间 足够多,发送多条消息。 但是,重复计数不是 累积的。 16-23扫描码。该 价值取决于OEM。
24表示密钥是否为 扩展键,如右手 显示在的ALT和CTRL键 增强的101键或102键键盘。该 如果是扩展密钥,则值为1; 否则,为0. 25-28保留;做 不使用
29上下文代码。如果是,则值为1 键是ALT键,键是 压制;如果WM_SYSKEYDOWN则为0 消息发布到活动窗口 因为没有窗口有键盘 对焦。
30以前的关键状态。价值 如果密钥在之前关闭,则为1 消息被发送,或者如果是密钥则为0 起来了。
31过渡国家。价值是 对于WM_SYSKEYDOWN消息,总是0。
答案 0 :(得分:1)
从lParam parameter of WM_KEYDOWN消息和Keystroke Message Flags章节的解释,我将编写以下代码来处理 lParam 的值:
iRepeatCount := LOWORD(lParam);
iScanCode := HIWORD(lParam) and $FF;
iExtendedKey := (HIWORD(lParam) and KF_EXTENDED) shr 8;
iContextCode := (HIWORD(lParam) and KF_ALTDOWN) shr 13;
iPreviousState := (HIWORD(lParam) and KF_REPEAT) shr 14;
iKeyDown := (HIWORD(lParam) and KF_UP) shr 15;
虽然它是Delphi实现,但我相信你能理解这么简单的代码。 : - )
好的,为方便起见,我在VB中使用等效的shr
指令,我得到了这个:
Private Function SHL(ByVal inVal As Long, ByVal inShift As Byte) As Long
SHL = inVal * (2 ^ inShift) ' Bit shift left
End Function
Private Function SHR(ByVal inVal As Long, ByVal inShift As Byte) As Long
SHR = inVal \ (2 ^ inShift) ' Bit shift right
End Function
要模仿VB中的LOWORD
和HIWORD
,请参阅How to Mimic HIWORD, LOWORD, HIBYTE, LOBYTE C Macros in VB。
答案 1 :(得分:0)
http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx
lparam是32位值;每个位控制WM_KEYDOWN消息的不同方面。 要正确填写lparam,您可以尝试使用spy ++来查看真实的WM_KEYDOWN消息。