3

我有一个 Raspberry Pi Zero,我把它变成了一个虚拟键盘和虚拟鼠标。我已经使用 github 上的这个惊人的(谢谢 SeongTae Jeong!)repo - rasp_vusb完成了它。简要总结一下它的工作原理:

  1. 您通过 USB 电缆将 PI Zero 连接到另一台计算机,然后使用以太网电缆将其连接到 Internet。
  2. 将其连接到计算机后,它会在设备管理器 (Windows) 中创建 3 个新设备:

    • 人机接口设备
      • USB输入设备
    • 键盘
      • HID 键盘设备
    • 鼠标和其他指点设备
      • HID 兼容鼠标(绝对位置 + 按钮)
      • HID 兼容鼠标(相对位置 + 滚轮)
  3. 在 PI 零上运行一个“服务器”(代码在 repo 的 rasp_vusb_server 中找到),它接受您的命令,然后将它们作为鼠标命令或键盘命令发送到您通过 USB 连接的设备。

  4. 您可以通过连接到它的 IP 并发送正确的数据,将命令从另一台计算机发送到 PI 零(服务器)。您可以在我提供的位于地图InputController中的 repo 中使用已经内置的程序

现在这在 Windows 10 build 1803 和 build 1903 上完美运行。它也适用于 Mac,但我没有在 Mac 上测试过键盘功能。当 Pi Zero 连接到 Windows 10(专业版或家庭版)版本 1809 时,会出现奇怪的问题。

键盘命令、相对鼠标命令(含义:将光标从您在 atm 上的位置向右移动 +50 像素)和鼠标按钮(单击)命令工作正常,但绝对鼠标命令(含义:将光标移动到X = 50, Y = 50 在屏幕上)和滚轮命令不起作用-光标一直在左上角捕捉(坐标,X=0,Y=0)

我在许多不同的计算机和 Windows 版本、不同的显示器(有些有触摸屏,有些没有)、不同的 Pi 零上尝试过这个。该问题仅出现在 Windows 10 build 1809 上。我尝试在网上搜索类似的问题,但所有答案都会导致一些触摸屏问题,但正如我所说,在我的情况下,触摸屏不是问题,因为它适用于不同的版本。

我实际上不确定这是否与问题有关,因为这是我们发送到 PI 零然后 PI 零将其发送到连接的设备的代码/命令)我开始挖掘代码,我发现发送绝对鼠标命令时发送的是长度为 15 的字节数组。我将举例说明,以便更好地理解:

假设您要发送绝对鼠标命令,即要将光标移动到屏幕上的X=50Y=100 。正如 repo 的自述文件中所述,您必须根据您的屏幕分辨率进行一些计算。假设我们有一个1920x1080的分辨率。然后我们发送 X=(50 * 32767 / 1920) = 853 和 Y=(100 * 32767 / 1080) = 3033。然后你必须调用一个函数byte[] ConvertToMouseCommands("853 3033")。它位于InputController/MouseDevice.csDemo/MouseDevice.cs的 repo 中。此函数将数字转换为字节数组,如下所示: (EDIT*) 我将把发送相对鼠标命令(如 (X=+50, Y=+50))时创建的字节数组放在其旁边以进行比较。

[0] = 11  <- Packet length (15 - 4)             [0] = 7 (11-4)                    
[1] = 0                                         [1] = 0
[2] = 0                                         [2] = 0
[3] = 0                                         [3] = 0
[4] = 7   <- 7 means absolute command           [4] = 6   <- 6 means relative commands
[5] = 85  <- (xPos & 0xff)                      [5] = 0                     
[6] = 3   <- (xPos & 0xff00) >> 8)              [6] = 50  <- xPos (Just xPos!) you can only send +-127 
[7] = 217 <- (yPos & 0xff)                      [7] = 50  <- yPos (Just yPos!) you can only send +-127 
[8] = 11  <- (yPos & 0xff00) >> 8)              [8] = 0
[9] = 0                                         [9] = 0
[10] = 0                                        [10] = 0
[11] = 0
[12] = 0
[13] = 0
[14] = 0

这些是我们发送到 PI 零的字节数组。当 PI 零接收到它们时,它使用两个函数(取决于它是相对鼠标命令还是绝对鼠标命令)进一步发送它们。这两个函数是void MouseDevice::SendRelative(int fd, char *mouseInput, int keyLen)void MouseDevice::SendAbsolute(int fd, char *mouseInput, int keyLen)。它们可以在rasp_vusb_server/MouseDevice.cpp的 repo 中找到。我不想在这里粘贴代码,因为这篇文章已经足够长了,但本质上它们发送 X 坐标、Y 坐标、如果单击按钮或鼠标上的滚轮已经旋转 - 看起来很简单大部头书。

正如我所说,该代码在其他 Windows 版本上完美运行,它只是在 1809 版本上失败。老实说,我什至不知道如何开始调试这样的东西。该版本中是否发生了某些变化-我应该发送的字节有所不同吗?是否有一些神奇的解决方案,例如禁用驱动程序或其他东西(一厢情愿)?我是否应该尝试更旧的 Windows 10 版本以查看它是否有效?

我将非常感谢您提供的任何信息。谢谢!

4

0 回答 0