提供 RIDEV_NOLEGACY 标志时的原始输入和窗口交互问题

bsd*_*unx 6 windows winapi

我有一些与使用 RIDEV_NOLEGACY 标志注册的原始输入设备相关的问题。

  • 当窗口处于非活动状态并且我通过鼠标单击将焦点设置到窗口时,将获得焦点但窗口 z 顺序保持不变。(使用 alt-tab 键时不会发生这种情况)
  • 无法与窗口镶边交互(调整大小、标题栏按钮)

在我的输入类中,我创建一个线程,它创建一个仅消息窗口并注册原始输入设备。在另一个线程中,我创建一个用于 OpenGL 渲染的窗口。

一切正常,直到指定 no Legacy 标志。也许这只是我对 Windows API 的无知。我尝试通过 ::Set[Active,Foreground]Window hacks 来解决第一个问题,但没有效果。是否有正确的方法来处理这些问题,或者我应该避免禁用旧的键盘和鼠标消息?

小智 4

当您注册来自设备的原始输入时,无论您的窗口是前台还是后台,您都会获得原始数据。另一种说法是:您从设备获取所有应用程序窗口的原始输入。因此,如果您通过使用 RIDEV_NOLEGACY 标志来阻止生成旧版 Windows 消息,您将阻止为所有 Windows 生成旧版 Windows 消息。大多数 Windows 应用程序都依赖于这些旧消息才能正确运行。如果您的应用程序不是全屏应用程序,则使用 RIDEV_NOLEGACY 不是一个好主意。

  • 澄清一下,RIDEV_NOLEGACY 显然只影响调用它的应用程序,而不是所有应用程序。但它是应用程序范围内的,因此拥有一个使用普通消息的窗口和另一个仅使用 RIDEV_NOLEGACY 进行原始输入的窗口似乎是不可能的。只是不要使用 RIDEV_NOLEGACY。 (3认同)
  • 为了进一步澄清,如果您正在创建单个窗口、全屏应用程序,您可能需要使用 RIDEV_NOLEGACY 来防止输入系统生成和调度 Windows 消息,例如 WM_KEYDOWN、WM_CHAR、WM_MOUSEMOVE 等。在这种情况下,您将使用原始输入根据您的需要捕获并响应键盘/鼠标状态。由于任务切换/内核中断等减少,这将带来性能优势。这可以归结为“遗留”一词的模糊用法。 (2认同)