【问题标题】:SendMessage CTRL + UP ARROW发送消息 CTRL + 向上箭头
【发布时间】:2020-03-23 11:03:17
【问题描述】:

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

这是 Spy++ 结果的样子:

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() 需要窗口成为焦点吗?因为我需要它在后台工作

标签: c# spy++


【解决方案1】:

使用 SendMessage(或 PostMessage)您无法模拟修饰键的状态,例如CTRL。您必须改用 SendInput。 [1] [2]

但是,使用 SendInput 您只能将键发送到活动窗口。所以,如果发送到最小化/背景窗口是一个严格的要求,我担心你想要做的事情是不可能的。 [2] [3]

如果您可以更改您的要求并将击键发送到活动窗口就足够了,或者您可以临时将要发送击键的窗口拉到前台,您可以考虑使用Input Simulator 库。

来源:
[1]https://stackoverflow.com/a/5145435/2498301
[2]How to send Ctrl/Shift/Alt + Key combinations to an application window? (via SendMessage)
[3]https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput

【讨论】:

    【解决方案2】:

    我刚刚解决了类似的问题(使用非托管 C++),但是我正在向 DOS 窗口发送击键,而不是同时通过一个键而不是 2 个或更多,您可以在这里看到原始问题:How to send keyboard input to dos application running in window mode in Windows98

    我使用了很多方法:SendMessage、SendInput 和 VxD 驱动程序,我还解决了发送按键之前激活窗口的问题,你可以在 github 上找到项目 - @987654322 @。在 MossbauerLab.Sm2201.ExtSaveUtility/src/saveManager 你可以找到方法:

    void activateWindow(HWND 窗口);

    我正在使用可执行文件名称和窗口名称来搜索 HWND(请参阅 MossbauerLab.Sm2201.ExtSaveUtility/src/utils/windows/windowsInfo.h)大多数类都使用 MS 测试(托管 C++)进行了测试,测试项目也在这个仓库:MossbauerLab.Sm2201.ExtSaveUtility.Tests

    也许对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2016-05-15
      • 2019-09-16
      相关资源
      最近更新 更多