c++ - 在 Windows 中使用两只鼠标执行完全不同的操作

标签 c++ windows api

我目前正在尝试开发一个应用程序以使用两只鼠标在 Windows 中执行完全不同的操作。然而,在花了几天时间之后,我开始怀疑我想做的事情是否甚至可以使用 Windows API。由于我远不是 Windows API 方面的专家,所以我想听听您的意见,以了解我是否正朝着正确的方向前进,或者我是否应该尝试完全不同的做法(也许开发驱动程序?)。

这就是我想要做的:想象一下我的电脑上插入了两只鼠标。我想将第一个用作普通鼠标,而第二个将用于执行完全不同的操作。例如,通过单击第二个鼠标左键,它会在 Firefox 中打开一个新选项卡(向 FireFox 应用程序发送 CTRL+T 命令),而当单击右键时,它会发送 CTRL+C。然后,通过向上移动第二个鼠标,它会放大,当向下移动时,firefox 页面会缩小(所以屏幕上的鼠标光标会在这样做时保持固定!)。这个想法也是为了识别当前使用的应用程序(哪个应用程序具有鼠标/键盘焦点)并根据它执行不同的操作。因此,例如,第二次鼠标左键单击会在 FireFox 中生成 CTRL+T,在 WORD 中生成 CTRL+B,在记事本中生成 CTRL+S(事实上,我们的想法是随意参数化这些操作)。所有这一切,而第一只老鼠必须继续像普通老鼠一样行动。

因此,重要的是要了解我的应用程序将在后台运行,并且永远不会直接与用户交互(没有 GUI,因为它不需要用户输入任何内容)。它的目的只是修改来自第二个鼠标的鼠标输入,并将其他输入(消息)发送到当前正在使用的应用程序。

到目前为止,我使用的是原始输入。我能够区分正在使用的鼠标,并且能够在第二个鼠标上执行操作时向其他应用程序发送消息(特定于应用程序)。我什至可以在移动第二个鼠标时将光标锁定在屏幕上(这样只有相应的消息才会发送到感兴趣的应用程序!)。但是,我无法阻止第二只鼠标向具有鼠标焦点的应用程序发送的按钮消息。因此,例如,当在记事本中单击第二个鼠标右键时,我的特定命令(目前为“aaa”,因为为了简单起见,我只是尝试使用字母)被发送(并显示在记事本窗口中)但是上下文记事本菜单也会打开......(因此它也会收到 WM_RBUTTONDOWN 消息)。

然后我的问题是:当使用第二个鼠标时,如何阻止其他应用程序接收鼠标按钮消息((WM_RBUTTONDOWN,等等……)?甚至可能吗?问题是(以我的理解)这些消息比 WM_input 消息 具有更高的优先级......所以当我在我的应用程序中读取 WM_input 消息并检测到按钮被按下时从第二只鼠标开始,已经太晚了,WM_xBUTTONDOWN 已经发送了!)

我知道使用鼠标 Hook ,我可以阻止它们,但是没有办法区分消息的来源(当然,检测使用的是哪个鼠标是我应用程序的要点)。

我也尝试过使用 DirectInput8,但它不再支持使用多个鼠标(Windows 特别说明要使用原始输入来达到这种效果)。

所以,我猜你知道我很迷茫,不知道我想做什么甚至可以实现。我们非常欢迎任何帮助。

期待阅读您的回复。

最佳答案

我正要建议 hooks,但后来我读到你已经调查过了。我想,解决您的问题的最后手段是编写您自己的驱动程序。 在 Windows 以通常的方式安装第二个鼠标后,您可以转到设备管理器并将要“重新调整用途”的鼠标的驱动程序更改为您自己的驱动程序。

虽然,开发驱动程序可能不是项目中的副任务。

关于c++ - 在 Windows 中使用两只鼠标执行完全不同的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44970592/

相关文章:

c++ - 为什么以下代码会使我的计算机发出蜂鸣声?

api - MS Word 2000 的 ColdFusion COM 对象操作在 100 秒后终止

javascript - 使用公共(public) API 访问(无 OAuth)从 JavaScript 写入 Google 电子表格

javascript - 谷歌日历 API Node

c++ - 从 Howard Hinnant 的日期库中提取日期和时间

c++ - 带迭代器的模板函数

c# - Windows 服务 (c#) 未启动

windows - 您如何从源代码构建 Windows D3D9 refrast?

.net - 寻找一本好的 C++/.net 书

c++ - 在 Tensorflow C++ 中使用 FIFOQueue 时遇到问题