【发布时间】:2020-03-23 11:03:17
【问题描述】:
我正在尝试复制 CTRL + UP ARROW 消息,但它就像忽略 CTRL 键,结果就像只发送 UP ARROW,不发送 CTRL
CTRL KEYDOWN:
向上箭头键:
向上箭头键:
CTRL KEYUP:
这是我正在使用的代码:
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, uint lParam);
SendMessage(whandle, 0x100, 0x00000011, 0x011D0001);
SendMessage(whandle, 0x100, 0x00000026, 0x01480001);
SendMessage(whandle, 0x101, 0x00000026, 0xC1480001);
SendMessage(whandle, 0x101, 0x00000011, 0xC11D0001);
我已更改此 SendMessage 签名以接受 KEYUP lParams:
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, uint lParam);
也许签名是错误的?我真的不知道我错过了什么
我不能使用 SendKeys 或任何需要在前面设置窗口的方法,它必须在后台工作,SetKeyBoardState 都不会影响其他正在运行的程序
编辑:
用 PostMessage 测试,我得到相同的结果,CTRL 键被忽略
PostMessage(whandle, 0x100, 0x00000011, 0x011D0001);
PostMessage(whandle, 0x100, 0x00000026, 0x01480001);
PostMessage(whandle, 0x101, 0x00000026, 0xC1480001);
PostMessage(whandle, 0x101, 0x00000011, 0xC11D0001);
【问题讨论】:
-
你试过用PostMessage代替SendMessage吗?
-
相同的结果,刚刚测试过,它忽略了 CTRL 键
-
也许尝试增加 KeyDowns 发送的数量。尝试使用 0x011D0050 而不是 0x011D0001。基本上,当您自己按住键时,您也会这样做。顺便说一句,这些只是一些疯狂的猜测。
-
臭名昭著的失败,代码只是假装 CTRL键被按下。但实际上并没有下降。因此,如果处理 VK_UP 通知的客户端代码检查修饰键状态,那么它将得出 CTRL 未关闭的结论。需要 SendInput()。
-
但是 SendInput() 需要窗口成为焦点吗?因为我需要它在后台工作