最近遇到个问题,使用 postmessage 每秒向【A窗口】发送一次 wm_keydown 和 wm_keyup的时候,在【B窗口】按住 shift ctrl alt 这类按键时,【A窗口】也会接收到shift ctrl alt,并且会影响到 postmessage向【A窗口】发送的消息。
下面是用spy++ 获取【A窗口】键盘消息的内容:
<000001> 00030742 P WM_KEYDOWN nVirtKey:'A' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000041 lParam:00000000]
<000002> 00030742 P WM_KEYUP nVirtKey:'A' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000041 lParam:00000000]
<000003> 00030742 P WM_CHAR chCharCode:'97' (97) cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000061 lParam:00000000]
可以看到chCharCode:'97' Ascii码对应的是小写的a键,但是我向【A窗口】发送的按键却是大写的A键,大写A键的ascii码是65。
当在【B窗口】按住shift ctrl alt 这类按键时,spy++ 获取【A窗口】键盘消息的内容:
<000013> 00030742 P WM_KEYDOWN nVirtKey:'A' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000041 lParam:00000000]
<000014> 00030742 P WM_KEYUP nVirtKey:'A' cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000041 lParam:00000000]
<000015> 00030742 P WM_CHAR chCharCode:'65' (65) cRepeat:0 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0 [wParam:00000041 lParam:00000000]
可以看到chCharCode:'65' Ascii码对应的是大写的A键。
所以请问为什么【A窗口】会接收到【B窗口】的shift ctrl 或是alt 的按键 从而影响了发送消息的结果,
如何能不让shift ctrl 或是alt 这类按键 影响到postmessage 向【A窗口】发送消息的wparam参数。
你的PostMessage参数是怎么填的?特别是lParam和wParam是多少?如果确定有影响也可以通过自定义消息解决,自定义一个消息然后在相应的窗口做消息处理从而避开这个问题。
这个是windows系统自身的消息机制,你postmessage中并不带控制键信息的,windows自己根据消息当时的控制键状态加的虚拟键code,我觉得这个很难改变的。但是可以在窗口消息处理中做处理,对虚拟键状态进行屏蔽,还原ASCII码再做后续处理。有帮助请采纳谢谢!
postmessage 没用过
WM_KEYFIRST WM_KEYDOWN 按下一个键
WM_KEYUP 释放一个键
WM_CHAR 按下某键,并已发出WM_KEYDOWN, WM_KEYUP消息
使用前2个组合 键盘输入会影响你所要达到的效果
第三个 不受键盘影响