WM_INPUT不在焦点上时没有收到

本文关键字:焦点 INPUT WM | 更新日期: 2023-09-27 17:56:08

我在C#中使用Windows Forms和SharpDX RawInput。

一切正常,但是当窗口失去焦点时,消息会停止。

我已经向Application.AddMessageFilter注册了自己的消息过滤器,一旦失去焦点,消息甚至不会到达那里。

WM_INPUT消息不是应该独立于焦点吗?当窗口在后台时,如何使它工作?

WM_INPUT不在焦点上时没有收到

窍是设置RIDEV_INPUTSINK标志。在SharpDX中,这被称为DeviceFlags.InputSink

您可以编辑演示应用程序,以便即使窗口未聚焦,仍能接收原始输入消息,方法是执行以下操作:

替换以下两行:

Device.RegisterDevice(UsagePage.Generic, UsageId.GenericMouse, DeviceFlags.None);
Device.RegisterDevice(UsagePage.Generic, UsageId.GenericKeyboard, DeviceFlags.None);

有了这两行:

Device.RegisterDevice(UsagePage.Generic, UsageId.GenericMouse, DeviceFlags.InputSink, form.Handle);
Device.RegisterDevice(UsagePage.Generic, UsageId.GenericKeyboard, DeviceFlags.InputSink, form.Handle);

因此,您将标志更改为 InputSink,并且您正在获取窗口的句柄,而在标志为 none 并且未指定窗口之前。