【问题标题】:Generate Keyboard Output in Java Program running as Windows Service在作为 Windows 服务运行的 Java 程序中生成键盘输出
【发布时间】:2019-01-23 14:14:20
【问题描述】:

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

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

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

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

我什至使用 JNA 库和 sendInput() 方法(作为 Robot 类的替代品)来创建尽可能接近操作系统级别的击键,但这也不起作用......我也试过使服务interactive 但这也不起作用。目前我的选择不多了。

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

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

【问题讨论】:

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


    【解决方案1】:

    这是一种称为会话 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


    此外
    请尝试注册到任务计划程序。
    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?)

    【讨论】:

    • 感谢您的确认,我阅读了这些文章,这很有意义。但问题是:有什么简单的方法可以解决这个问题。或者我应该将我的应用程序作为带有 javaw(隐藏控制台)icw 系统托盘通知的 .bat 文件运行?无论如何,非常感谢您的反馈!
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    相关资源
    最近更新 更多