1

作为低于 VB/VBS 的业余爱好者(C++ WINAPI 对我有经验的人来说是一场噩梦),我不知道如何在 C++ 中为简单的 KEYDOWN 消息构建长 lParam,并且可能花了更多时间寻找体面的解释比值得,有人能够准确地描述如何去做吗?

似乎其他论坛上几乎所有对这个问题的回答都是“为什么”或“改用 SendInput”,而没有真正回答这个问题;我猜它太简单了,人们无法解释。无论如何,这是来自 msdn 的描述,非常感谢一个体面的解释或链接,如果可能的话,还有一个工作示例:

重复计数、扫描码、扩展键标志、上下文代码、前一个键状态标志和转换状态标志,如图所示……

0-15 当前消息的重复计数。该值是由于用户按住键而自动重复击键的次数。如果击键时间足够长,则会发送多条消息。但是,重复计数不是累积的。16-23 扫码。该值取决于 OEM。

24 指示该键是否为扩展键,例如出现在增强型 101 或 102 键键盘上的右手 ALT 和 CTRL 键。如果是扩展键,则值为 1;否则为0。 25-28 保留;不使用

29 上下文代码。如果 ALT 键在按下时按下,则值为 1;如果 WM_SYSKEYDOWN 消息发布到活动窗口,则为 0,因为没有窗口具有键盘焦点。

30 前一个键状态。如果在发送消息之前 key 处于 down 状态,则值为 1,如果 key 处于 up 状态,则值为 0。

31 过渡状态。对于 WM_SYSKEYDOWN 消息,该值始终为 0。

4

2 回答 2

1

WM_KEYDOWN消息的lParam参数和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实现,但是这么简单的代码相信大家都能看懂。:-)

好的,为了您的方便,我用谷歌搜索shr了 VB 中的等效指令,我得到了这个:

  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 中模拟LOWORDand HIWORD,请参阅如何在 VB 中模拟 HIWORD、LOWORD、HIBYTE、LOBYTE C 宏

于 2010-10-23T18:53:29.857 回答
0

http://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx

lparam 是一个 32 位的值;每个位控制 WM_KEYDOWN 消息的不同方面。要正确填写 lparam,您可以尝试使用 spy++ 来查看真正的 WM_KEYDOWN 消息的样子。

于 2010-10-23T19:16:03.450 回答