在以Windows服务运行的Java程序中生成键盘输出

时间:2019-01-23 14:14:20

标签: java serial-port windows-services barcode-scanner keyboard-events

我创建了一个简单的独立Java应用程序(JAR),该应用程序通过虚拟COM端口(使用RxTx库来建立COM连接)连接到Honeywell条形码扫描仪。

连接后,程序将接收来自扫描仪的输入,使用一些自定义逻辑对其进行转换,最后使用Robot类将转换后的输出重定向到标准输出。没什么复杂的。

因此,如果我运行该程序然后扫描值“ A”,则应用程序会将其转换为“ B”,并且当记事本处于活动状态(或其他输入字段/程序)时,输出“ B”,就像它最初是由扫描仪扫描的。

当以jar文件(或包裹bat文件)运行时,该程序可以完美运行。但是,当将此JAR / BAT文件包装为Windows服务(使用JSW Community Edition或YAJSW)时,该程序将正常运行,但不会输出Robot.class执行的“模仿”键击。

我什至使用JNA库和fn partial_cmp(&self, other: &dyn SimpleOrder) -> Option<Ordering> { Some(self.key().cmp(&other.key())) } 方法(代替Robot类)来创建尽可能接近操作系统级别的击键,但这也不起作用。 。我还尝试过提供服务interactive,但这也没有用。目前,我已经没有其他选择了。

所以我的问题是:作为Windows服务运行时,不能生成键盘按下事件是否正确?我可以想象这可能是一个很大的安全问题,因此也许是不允许的。

非常欢迎任何反馈或可能的解决方案!提前非常感谢!

1 个答案:

答案 0 :(得分:2)

这是一个称为会话0隔离的规范,是Windows Vista引入的。
充当WindowsService的程序没有用户界面。
请参阅这些文章和文档。

Application Compatibility – Session 0 Isolation
Session 0 Isolation - Microsoft Download Center

What is Session 0 Isolation? What do I need to know about it?
Session 0 Isolation and Secure Desktop: Windows 7 AppCompat Series


另外
请尝试注册到Task Scheduler。
Register task in windows task scheduler in java

在这种情况下,除非它是“仅在用户登录时运行”,否则它可能无效。
这是有关Windows Server的文章。
show window of task scheduler schedule program.

但是,即使您这样做,它也可能无法使用。
Simple c++ program fails to run as a scheduled-task (interactive/non-interactive issue?)