c# - 发送消息 CTRL + 向上箭头
问题描述
我正在尝试复制 CTRL + UP ARROW 消息,但这就像忽略 CTRL 键,结果就像只发送 UP ARROW,而不发送 CTRL
CTRL 键下:
向上箭头键:
向上箭头键:
CTRL键:
这是我正在使用的代码:
[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);
解决方案
使用 SendMessage(或 PostMessage)您无法模拟修饰键的状态,例如 CTRL。您必须改用 SendInput。[1] [2]
但是,使用 SendInput 您只能将键发送到活动窗口。所以,如果发送到最小化/背景窗口是一个严格的要求,我担心你想要做的事情是不可能的。[2] [3]
如果您可以更改您的要求并将击键发送到活动窗口就足够了,或者您可以临时将要发送击键的窗口拉到前台,您可以考虑使用输入模拟器库。
来源:
[1] https://stackoverflow.com/a/5145435/2498301
[2]如何将 Ctrl/Shift/Alt + 组合键发送到应用程序窗口?(通过 SendMessage)
[3] https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput
推荐阅读
- sql - redshift 是否存储失败的查询?
- swift - 如何扩展 UISlider 以便它使用检测滑块值何时更改的回调?
- excel - 在用户窗体打开时选择单元格
- corda - 在 deployNodes 期间设置 Corda postgres 表
- python - 使用正则表达式的验证时间格式
- kivy - 如何在 Kivy 中使用希伯来字体?
- javascript - 导航栏不会在第一次点击时更新活动 li
- javascript - 执行 HTTP.put 请求后停止“导航到”
- python - 如何使用命令行备份 postgres 数据库
- shopify - Shopify LinkList 循环使用动态变量