C ++ WINAPI:如何使用SendMessage / PostMessage WM_KEYDOWN lparam

时间:2010-10-23 09:58:14

标签: winapi keydown sendmessage sendkeys postmessage

作为一个低于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。

2 个答案:

答案 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中的LOWORDHIWORD,请参阅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消息。