首页 > 解决方案 > 发送消息 CTRL + 向上箭头

问题描述

我正在尝试复制 CTRL + UP ARROW 消息,但这就像忽略 CTRL 键,结果就像只发送 UP ARROW,而不发送 CTRL

这是 Spy++ 结果的样子: 在此处输入图像描述

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);

标签: c#spy++

解决方案


使用 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


推荐阅读