Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Usb 滚动我自己的Windows操纵杆HID驱动程序?_Usb_Hid_Joystick - Fatal编程技术网

Usb 滚动我自己的Windows操纵杆HID驱动程序?

Usb 滚动我自己的Windows操纵杆HID驱动程序?,usb,hid,joystick,Usb,Hid,Joystick,我有一个USB操纵杆,我想为它编写自己的HID驱动程序。值得注意的是,我希望在Windows接收操纵杆输入和我的应用程序收到输入事件通知之间注入延迟。我还想更改我的应用程序感知到的操纵杆的标识。我从来没有为Windows编写过驱动程序,更不用说HID驱动程序了。有谁能给我一些建议或指点,告诉我怎么做吗?你想做的是一个过滤器驱动程序 筛选器驱动程序是可选的驱动程序,可为设备添加值或修改其行为。筛选器驱动程序可以为一个或多个设备提供服务。 资料来源: 我认为WDK包含您必须从此处下载Windows驱

我有一个USB操纵杆,我想为它编写自己的HID驱动程序。值得注意的是,我希望在Windows接收操纵杆输入和我的应用程序收到输入事件通知之间注入延迟。我还想更改我的应用程序感知到的操纵杆的标识。我从来没有为Windows编写过驱动程序,更不用说HID驱动程序了。有谁能给我一些建议或指点,告诉我怎么做吗?

你想做的是一个过滤器驱动程序

筛选器驱动程序是可选的驱动程序,可为设备添加值或修改其行为。筛选器驱动程序可以为一个或多个设备提供服务。 资料来源:

我认为WDK包含您必须从此处下载Windows驱动程序工具包的示例:

WDK可能包含创建过滤器的示例代码

microsoft网站上还有以下下载内容:


它可能有点过时,因为NT5.0之前不支持USB,但它可能仍然相关。

当您按下操纵杆上的旋钮时,电信号通过驱动链以的形式到达操作系统(并进入游戏)。在某个点拦截这些IRP并延迟转发到下一个驾驶员可以延迟操纵杆输入。这可以通过以下方法实现

要编写您需要使用的windows驱动程序

windows驱动程序的入口点是。在这个函数中,你将连接你想要截取的IRP和处理它们的回调函数,在我们的例子中,是延迟转发的回调函数

例如,假设我们要延迟的IRP是
IRP\u MJ\u READ
,我们的回调函数被称为
CallbackDelayForwarding

// the function that delays the IRP
NTSTATUS CallbackDelayForwarding(
    IN PDEVICE_OBJECT pDeviceObject, 
    IN PIRP pIrp
){
    // delay the forwarding
}

// this is the driver entrypoint, similar to "main" in user-mode executables
NTSTATUS DriverEntry(
    IN PDRIVER_OBJECT pDriverObject, 
    IN PUNICODE_STRING RegistryPath 
){
    pDriverObject->MajorFunction[IRP_MJ_READ] = CallbackDelayForwarding;
    ...
}
要在
CallbackDelayForwarding
内部延迟转发,必须使用该系列的函数来模拟某种睡眠(可能与锁结合使用)、KeDelayExecutionThread等

要在操纵杆驱动链中安装过滤器驱动程序,可以使用

检查Windk中的,您可以在
INSTALL\u DIR/src/general/toaster/
中找到它,另请参见

相关链接:


我觉得你可以使用

然后操纵杆事件将触发
WM_JOYMOVE
事件,尽管消息的
wParam
lParam
是什么我不知道

然后当您的程序关闭或您不再需要
joyReleaseCapture(JOYSTICKID1)
等时
它可能只是空参数,然后告诉您使用
joyGetPos
joyGetPosEx
函数 从USB设备中查找自己的数据。

您可能需要使用。这是一种windows脚本语言,可以重新映射鼠标/键盘/操纵杆的每个键。如果您通过脚本捕获密钥,并在将正确的密钥/宏发送到活动应用程序之前插入延迟,则您可能有部分问题的解决方案

joySetCapture(wnd, JOYSTICKID1) or joySetCapture(wnd,JOYSTICKID2)