2010-10-23 183 views
1

作为一个业余的任何低于VB/VBS(C++的WINAPI是我的经验的人的噩梦)我不知道如何去构建一个长的lParam C++中的简单KEYDOWN消息,可能花费更多时间寻找比值得体面的解释,有人能够准确描述如何去做这件事?C++ WINAPI:如何使用SendMessage/PostMessage WM_KEYDOWN lparam

看来,在其他论坛上几乎对这个问题的每一个回应都是“为什么”或“使用SendInput”,而没有真正回答问题;我猜测这对于人们来说太简单了。反正这里是从MSDN的描述,非常感谢一个体面的解释或链接到一个可以和样例如果可能的话:

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

0-15当前 消息的重复计数。该值是按键 乘以 键的自动重复次数 。如果足够长的击键长度,则发送多个消息。 但是,重复计数不是 累计。 16-23扫描码。 值取决于OEM。

24表明密钥是否是 扩展键,如右侧 ALT和CTRL键出现一个 增强101或102键键盘上。如果它是扩展密钥,则 的值为1; 否则为0. 25-28保留;做 不使用

29上下文代码。如果 ALT键处于关闭状态,而按键为 则值为1;如果WM_SYSKEYDOWN 消息被发布到活动窗口 ,则为0,因为没有窗口具有焦点的键盘 。

30上一个关键状态。如果密钥在发送 消息之前关闭,则值为 ;如果密钥 已启动,则值为0。

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

+0

改为使用SendInput。真。如果您不相信,请提出一个问题。 – 2010-10-23 10:58:57

+0

对SendMessage最感兴趣的是在自动GUI界面中处理重复任务的对话框(例如,在由CMS控制的数据库中添加/更新记录,这将不允许直接访问SQL数据库);理想情况下,这可以做到没有失去焦点的风险,所以没有整个计算机占用。没有强大的编码背景,所以它似乎是处理输入类型=“文件”元素的最简单/最安全的方式,而不是直接寻址表单 – 2010-10-24 13:18:26

回答

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实现,我相信你可以理解这样一个简单的代码。 :-)

OK,为了您的方便,我谷歌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中LOWORDHIWORD,看到How to Mimic HIWORD, LOWORD, HIBYTE, LOBYTE C Macros in VB

+0

谢谢,有道理 – 2010-10-24 13:12:35