分享

PostMessage到底能不能发送组合键?

 quasiceo 2014-07-11
最近在写一个向指定窗口发送按键的UDF,打算用PostMessage完全实现Send函数所有功能。但是被组合键郁闷到了。
比如发送大写字母A,应该是先WM_KEYDOWN一次VK_SHIFT,再WM_KEYDOWN一次VK_A,最后WM_KEYUP释放两个键。但是最终结果,窗口只出现一个小写字母a。也就是说,窗口根本不管之前发送的VK_SHIFT。
用Spy++查看键盘消息,发现手动按键和程序发送一模一样(见下)。就是结果不一样。。。
google一下“PostMessage 组合键”,发现csdn,看雪,vbgood几个地方早有人讨论这个问题,结论是PostMessage按键时,窗口是直接读取当前VK_SHIFT状态,而不管之前是否收到VK_SHIFT的WM_KEYDOWN消息。解决方法有几个。一是keybd_event(SendInput,或者au3的Send也行)先发送一个VK_SHIFT按下消息,再发送按键,缺点是这会影响到同时运行的别的程序。还有更复杂的,hook几个返回键盘状态的api,让它们返回VK_SHIFT已被按下的假象,缺点就不用说了,太复杂,从效率来说还不如直接Send。
没信心了,现在在尝试WM_HOTKEY。如果有朋友也研究过这个问题,请指点一下。

Spy++拦截到的消息,模拟对象为记事本。WM_CHAR是自动产生的,可以看出结果不一样。
手动按键:
<00001> 00020470 P WM_KEYDOWN nVirtKey:VK_SHIFT cRepeat:1 ScanCode:2A fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000010 lParam:002A0001 time:1:23:59.968]
<00002> 00020470 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000041 lParam:001E0001 time:1:24:00.187]
<00003> 00020470 P WM_CHAR chCharCode:'0041' (65) cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000041 lParam:001E0001 time:1:24:00.187]
<00004> 00020470 P WM_KEYUP nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:1 [wParam:00000041 lParam:C01E0001 time:1:24:00.328]
<00005> 00020470 P WM_KEYUP nVirtKey:VK_SHIFT cRepeat:1 ScanCode:2A fExtended:0 fAltDown:0 fRepeat:1 fUp:1 [wParam:00000010 lParam:C02A0001 time:1:24:00.375]

程序发送:
<00006> 00020470 P WM_KEYDOWN nVirtKey:VK_SHIFT cRepeat:1 ScanCode:2A fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000010 lParam:002A0001 time:1:24:20.046]
<00007> 00020470 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000041 lParam:001E0001 time:1:24:20.062]
<00008> 00020470 P WM_CHAR chCharCode:'0061' (97) cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000061 lParam:001E0001 time:1:24:20.062]
<00009> 00020470 P WM_KEYUP nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:1 [wParam:00000041 lParam:C01E0001 time:1:24:20.078]
<00010> 00020470 P WM_KEYUP nVirtKey:VK_SHIFT cRepeat:1 ScanCode:2A fExtended:0 fAltDown:0 fRepeat:1 fUp:1 [wParam:00000010 lParam:C02A0001 time:1:24:20.093]

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多