在以Windows服务运行的Java程序中生成键盘输出
作者:互联网
我创建了一个简单的独立Java应用程序(JAR),该应用程序通过虚拟COM端口连接霍尼韦尔条形码扫描仪(使用RxTx库来设置COM连接).
连接后,程序将接收来自扫描仪的输入,使用一些自定义逻辑对其进行转换,最后使用Robot类将转换后的输出重定向到标准输出.没什么复杂的.
因此,如果我运行该程序然后扫描值“ A”,则应用程序会将其转换为“ B”,并且当记事本处于活动状态(或其他一些输入字段/程序)时,将输出“ B”,就像它最初被扫描一样由扫描仪.
当以jar文件(或包装bat文件)运行时,该程序可以完美运行.但是,当将此JAR / BAT文件包装为Windows服务时(使用JSW Community Edition或YAJSW),该程序将正常运行,但不会输出Robot.class执行的“模仿”键击.
我什至使用带有sendInput()方法的JNA库(代替Robot类)来创建尽可能接近操作系统级别的击键,但这也行不通…我也尝试使服务interactive但这也没有用.目前,我已经没有选择了.
所以我的问题是:作为Windows服务运行时,您不能生成键盘按下事件是否正确?我可以想象这可能是一个很大的安全问题,因此可能是不允许的.
任何反馈或可能的解决方案将非常欢迎!提前谢谢了!
解决方法:
这是一个称为会话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?)
标签:barcode-scanner,windows-services,keyboard-events,serial-port,java 来源: https://codeday.me/bug/20191211/2106730.html