我目前正在尝试开发一个应用程序以使用两只鼠标在 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/