1

问题 我正在开发一个自定义硬件控制器,我想在用 Java 处理它之后将它的输入映射到一个虚拟 XInput 控制器。基本上出于所有意图和目的,我想直接从 java 控制 XInput 控制器。

我想到的解决方案

  • 编写设备驱动程序,这似乎是我很乐意避免的真正痛苦。我以前从未编写过设备驱动程序,也不知道如何注册 XInput 控制器。这似乎需要很长时间才能完成,我没有也不想花时间。
  • 使用 PPJoy 和这个库。我想避免这种情况,因为 PPJoy 已经过时了(自我能找到的上次更新以来已超过 10 年),并且需要一个额外的层来将 DirectInput 转换为 XInput。该库也拒绝为我编译。
  • 为VJoy开发一个包装器。然而,这需要从 DirectInput 重新映射到 XInput。我不熟悉 C/C++ 包装,但到目前为止这似乎是最好的选择。

有谁知道如何解决这个问题?我曾考虑跳过 XInput 并使用机器人 (AWT) 使用键盘/鼠标来完成,但游戏拒绝接收软件输入,很可能它们只读取硬件数据。模拟键盘/鼠标会很好,但不是最佳的,因为它会很尴尬,但是我无法找到一种方法来以游戏识别的方式来做到这一点。所有帮助表示赞赏!

4

1 回答 1

0

编写一个包装器,你不需要知道任何东西,如果你真的不想,我会重复任何 C++ 代码。只需使用swig。有很多例子,从一些基本的开始。(注意我不打算包括例子,因为那里已经有足够的东西了)。如果您有问题发表评论,我会帮助您。

编辑 好吧,我会很好,快速示例,假设您有一个 example.h 文件,在同一位置创建一个 example.i:

%module example

%{
#include "example.h"
%}

%include "example.h"

确保 swig 在您的路径中,然后执行以下操作:

%swig -java example.i

然后你需要构建一个原生的java库,比如这里是怎么做的,(注意你不需要做所有javah的东西),但基本上:

% g++ -Wl,--add-stdcall-alias -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" 
  -shared -o example.dll example.c example.cpp

它为您提供了您的 dll,在运行您的 java 程序时,您必须将其与任何其他依赖库一起保留在您的路径中。请注意,如果您编译 32 位库,则需要使用 32 位 jvm。

于 2015-09-01T14:42:08.833 回答