5

我有一个仅消息窗口(ATL::CWindowImpl),它使用 RIDEV_INPUTSINK 标志为原始输入注册自身,这意味着无论窗口是否是前景窗口,它都会获取所有输入。当该窗口只有一个实例时,这很有效。

但是,当我创建超过 1 个窗口实例时,只有一个会收到 WM_INPUT 消息(我目前正在创建两个,只有要创建的第二个会收到消息)。

RegisterRawInputDevices(使用 RIDEV_INPUTSINK | RIDEV_NOLEGACY)在创建两个窗口期间均成功。此外,未接收原始输入的窗口仍在接收其他消息,因此窗口本身没有问题......

如果相关,我正在使用 VC11 测试版,并创建窗口并在不同的线程上调度消息(使用 std::thread)。

这是 API 限制吗(即每个进程只能使用一个输入接收器)?或者有没有办法让这个工作?

提前致谢。

编辑:

现在我目前的解决方法是只有一个窗口并将输入消息传递给其他窗口,但是这是一团糟,并且在我希望它工作的情况下不起作用(我有我的可能需要原始输入的应用程序加载插件,我不希望它们必须在我的应用程序中注册,除非我真的必须这样做......)。

4

1 回答 1

6

从 MSDN (这里这里)原始输入的整个 API 总是谈论应用程序而不是窗口......这意味着注册原始输入的应用程序将被操作系统视为一个实体......你间接证明了这一点注册第二个接收窗口——第一个窗口刚刚停止接收,因为操作系统将原始输入传递给应用程序(完全由 onw 窗口表示为接收器)。

于 2012-03-18T05:46:05.680 回答