Windows下通过USB虚拟的键盘鼠标总结

2021-08-05 6904 76

产品级详见:https://www.usbzh.com/article/detail-1182.html

哐哐铛铛的,终于把以前搞的虚拟键盘、鼠标的驱动代码重新整理完成,并且在此基础上将USB虚拟的键盘和鼠标整合到一个驱动中。
将键盘和鼠标的代码合并在一起的原因很简单:

  • 第一是为了验证自己写的这个虚拟的总线的功能
  • 第二就是键盘一般和鼠标是联系在一起的,用键盘的地方大部也要用到鼠标。所以干脆将这两个设备合并到一起,这样在创建的时候可以一起创建,也可以一起销毁。当然键盘和鼠标的数据可以通过应用层分开下发给驱动的。

实现的最终效果如下图:
USB虚拟的键盘鼠标总结

该驱动被命名为USBzhVKM,usbzh当然是本站USB中文网的词牌名了。VKM就是virtual keyboard & mouse的缩写了。
本人开发的这个驱动使用的是VS2019+WDK10实现的,可以编译成X64也可以编译成X86的,对于老的系统如win7之类的系统的支持可以参考本人在pnpon内核开发网发的这篇文章 Win10和Win7驱动security_init_cookie蓝屏兼容问题 http://www.pnpon.com/article/detail-120.html 进行工程的修改。
工程我这就不修改了,因为本人使用的电脑环境现在全是win10环境了。

这里介绍一下自己写的应用层通读接口,之前也发过鼠标的应用及调试文章,可见:

驱动层:

使用VS2019打开工程如下图:
VS2019打开工程
可以看到,本人还是将代码整理的比较清晰的(哈哈~),基本上做了代码属于那层的在那个文件中…
或程编译后,生成的文件如下:

usbzhvkm.cat
UsbzhVKM.inf
UsbzhVKM.sys

驱动的安装这里可以调用本人写的一个批处理文件 install.bat,代码比较简单,是直接使用devcon.exe来进行驱动的安装的。

CD /d %~dp0
devcon.exe install UsbzhVKM.inf "root\UsbzhVKM"

应用层

应用层本人鬼使神差的命名了一个D2004的工程.界面如下:
应用层

程序主要是通过DeviceIoControl与自己写的驱动进行数据通讯,本人编写了一个类,封装了几个函数:

class CUsb
{
public:
    CUsb();
    ~CUsb();
public:
    HANDLE m_hDevice;
public:
    static BOOL USBEnumDevice(OUT PTCHAR pDeviceName, IN int instance);

    BOOL UsbOpenDevice(PTCHAR pDeviceName);
    VOID UsbClose();

    BOOL SetMouseData(PVOID pData, ULONG nLen, PULONG pRtn);
    BOOL SetKeyBoard(PVOID pData, ULONG nLen, PULONG pRtn);

    BOOL PluginDevice();
    BOOL UnPluginDevice();
};

可以看到,通过USBEnumDevice枚举出设备,然后调用UsbOpenDevice打开设备,这样就可以使用PluginDevice和UnPluginDevice在设备管理器中创建和销毁虚拟的USB键盘和USB鼠标设备了。

默认安装了驱动后,不创建虚拟键盘和鼠标。

当设备创建之后,可以分别调用对应的函数进行鼠标报告内容和键盘报告内容的写入给驱动,这样驱动给将该报告内容转成标准的USB事件上报给系统。

关于报告的格式可详见:

这里本人写了一个简单的测试用列:
键盘的模拟:

void CVMouseDlg::OnBnClickedButtonKeyBoardTest()
{
    ULONG rtn = 0;
    UCHAR data[8] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };

    Sleep(1000);
    for (int i = 0; i < 40; i++)
    {
        data[2] = 0x04 + i;
        m_usb.SetKeyBoard(data, 8, &rtn);//按下
        Sleep(100);

        data[2] = 0;
        m_usb.SetKeyBoard(data, 8, &rtn);//弹起

        Sleep(200);
    }
}

鼠标的模拟,这里没有写滚轮的:


void CVMouseDlg::MouseLeft()
{
    ULONG rtn = 0;
    UCHAR data[4] = { 0x00,0xFF,0x00,0x00 };
    m_usb.SetMouseData(data, 4, &rtn);
}
void  CVMouseDlg::MouseRight()
{
    ULONG rtn = 0;
    UCHAR data[4] = { 0x00,0x01,0x00,0x00 };
    m_usb.SetMouseData(data, 4, &rtn);
}

void  CVMouseDlg::MouseUp()
{
    ULONG rtn = 0;
    UCHAR data[4] = { 0x00,0x00,0xff,0x00 };
    m_usb.SetMouseData(data, 4, &rtn);
}
void  CVMouseDlg::MouseDown()
{
    ULONG rtn = 0;
    UCHAR data[4] = { 0x00,0x00,0x01,0x00 };
    m_usb.SetMouseData(data, 4, &rtn);
}
void  CVMouseDlg::MouseLeftClickDown()
{
    ULONG rtn = 0;
    UCHAR data[4] = { 0x01,0x00,0x000,0x00 };
    m_usb.SetMouseData(data, 4, &rtn);

}
void CVMouseDlg::MouseLeftClickUp()
{
    ULONG rtn = 0;
    UCHAR data[4] = { 0x00,0x00,0x000,0x00 };
    m_usb.SetMouseData(data, 4, &rtn);

}
HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

Windows下UVC虚拟摄像头的实现
最近在Windows10 x64环境下,开发了一个虚拟UVC摄像头驱动。确切的来说这不是摄像头驱动,而是一个虚拟USB总线驱动。使用该虚拟总线驱动使用应用软件通过IOCTL控制总线子设备的创建与卸载。驱动安装完成后,是一个单纯的USB虚拟总线。应用软件通过发送自定义IOCTL码IOCTL_BUSEN......
HID键盘设备数据抓包分析实践
本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理。在进行数据分析前,我们先回顾一下USB相关的基础知识。USB描述符USB 主机是通过各种描述符来识别设备的,有设备描述符,接口描述符,端点描述符,字符描述符,报告描述符(HID)等。和普通的......
USB键盘报告描述符数据格式分析
USB键盘的HID报表描述符的内容参见下表。数据的输入端点为中断方式,当有键盘敲击事件时,会上报数据长度为8字节的数据报告。0x05,0x01,// Global Generic Desktop0x09,0x06,// Local KeyBoard 0xA1,0x01,// Main app col......
HID 报表描述符键盘实例
通过下面的报告描述符的定义,我们根据上面的注释可知,包含一个中断输入报表描述符和一个中断输出报告描述符。其中断输入报告描述符用于USB HID键盘中断输入端点,输出报表描述符用于USB HID键盘中断输出端点。USB HID键盘的中断输入报告对于中断输入端点,数据格式定义如下:BYTE0:该字......
USB鼠标HID报告描述符数据格式分析
注意:这里的鼠标为普通鼠标报告描述符的信息解释,其并不适用于全鼠标报表描述符。一个示例如下:0x05,0x01, // Global Generic Desktop0x09,0x02, // Local Mouse0xa1,0x01, // Main app collection0x09,......
BIOS下识别USB键盘
在BIOS下要识别一个USB键盘和在操作系统下识别一个USB键盘其实是有一些区别的:首先接口描述符中bInterfaceClass的值必须为0x03,bInterfaceSubClass的值为0或1,为1表示HID设备符是一个启动设备(Boot Device,一般对PC机而言才有意义,意思是BIO......
为什么Windows7重新安装系统后插在USB3.0端口的鼠标不能使用?
在 Windows 7 及更早版本的操作系统中,USB 3.0 驱动程序堆栈由第三方提供,操作系统不提供USB3.0驱动栈。 因此,Windows7重新安装系统后插在USB3.0端口上的所有设备都无法工作,需要安装第三方提供的USB控制器和集线器驱动,这样才能识别出挂接在该USB总线下的设备。从Wi......
USB键盘与HID报表描述符关系
报告描述符确实非常复杂,要看懂协议真得比较难(因为只有英文的),我见到的国内教材也没有对这部分写得很详细的,有的也只是部分内容的翻译而已。一般建议用示例报告描述符修改一下就可以了,《Hid Usage Table》里给出了一些常见应用的报告描述符。对于键盘类应用,通常用已有的示例已经够用了。“如果是......
HID 报表描述符鼠标实例
USAGE_PAGE (Generic Desktop) 05 01USAGE (Mouse) 09 02COLLECTION (Application) A1 01 ......
Win10使用虚拟USB鼠标实现自动挂机测试功能
昨天要测试一个软件不停的整机的功能:在整机软件中需要不停地点击某个软件的按钮,启动会议功能,然后隔一段时间后,需要再次呼出关闭按钮,并点击将该按钮停止会议,如此往复的操作。当然这些操作是需要人工操作点击软件界面的某些按钮实现的。本以为是一个很简单的东西,没想到还是弄出了花样。初始版本 - 脚本方......
USB鼠标HID全局坐标报表描述符
常用的USB HID鼠标是相对的描述符,鼠标的移动是相对当前位置的相对移动。如相对当前位置左移,右移等。这种相对的坐标描述符有的时候在使用上有一定麻烦的,最重要的原因就是需要计算鼠标指针的当前位置。如本人之前做的一个USB鼠标挂机测试脚本,内容详见:http://www.usbzh.com/ar......
HID复合设备(键盘鼠标)的实现
在使用一些USB键盘鼠标的时候,特别是一些电竟高档HID设备时,经常发现这些设备会额外定义一些特别的快捷键,使得这些设备不仅有基础设备(如键盘鼠标)的功能,也有一些特别的快捷功能(如系统声音的放大放小)。甚至更有一些复杂的设备,只需要一个USB接口,就同时支持鼠标键盘功能或在键盘的额外区域支持触......
USB HID键盘设备树及设备枚举过程分析
今天在本站USB中文网微信技术交流群有一个同学在问关于HID设备的报表描述符的东东。但是在问的过程中发现一个很严重的问题,那就是它的它设备是一个复合设备,导致设备树比较复杂,关于报表描述符与接口描述符等之间的相关对应关系不是很清楚。为此,本人手中刚好有一个本人认为USB HID设备中相对比较复杂的设......
Windows10下开发虚拟USB鼠标之枚举子设备失败(STATUS_DEVICE_DATA_ERROR)
之前发过一篇文章:Win10使用虚拟USB鼠标实现自动挂机测试功能(文章地址:http://www.usbzh.com/article/detail-476.html ) 使用的是虚拟驱动实现的一个虚拟USB鼠标,实现了产品的自动测试功能。生成的设备在设备管理器中如下:但在开发过程中,并不是一帆......
Windows下通过USB虚拟键盘鼠标总结
产品级详见:https://www.usbzh.com/article/detail-1182.html哐哐铛铛的,终于把以前搞的虚拟键盘鼠标的驱动代码重新整理完成,并且在此基础上将USB虚拟键盘鼠标整合到一个驱动中。将键盘鼠标的代码合并在一起的原因很简单:第一是为了验证自己写的这个虚......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!