【问题标题】:Turning off monitor with JNA in Java doesn't work as expected在 Java 中使用 JNA 关闭监视器无法按预期工作
【发布时间】:2019-03-03 20:59:32
【问题描述】:

使用this example 的JNA 关闭显示器我遇到了以下问题: 显示器按预期关闭,但在一秒钟内立即打开。即使我在睡觉和打开显示器时注释掉部分。都一样。

我认为当控制权返回主线程时监视器会打开。但事实并非如此。在新线程中运行这个 sn-p 会导致相同的结果。

我也尝试过 powershell 脚本做同样的事情,它就像一个魅力。但不是 Java sn-p。

我做错了什么?或者这有什么问题。

【问题讨论】:

    标签: java windows jna monitor


    【解决方案1】:

    “没有按预期工作”可能意味着您的期望是错误的。

    值得注意的是,linked code 存在一些问题,我假设您是逐字使用的。 SendMessage 函数被映射两次。第一个映射是正确的,但从未使用过:

      LRESULT SendMessageA(HWND paramHWND, int paramInt, WPARAM paramWPARAM,
            LPARAM paramLPARAM);
    

    第二个映射将int 替换为WPARAM,如果这里的某些结果不寻常,我也不会感到惊讶,尤其是在64 位系统/JVM 上。这是代码中调用的版本。

      LRESULT SendMessageA(HWND paramHWND, int paramInt, int paramInt2,
            LPARAM paramLPARAM);
    

    除此之外,代码确实按预期工作,activates the power management features 关闭显示器!您期望的问题是您没有考虑过什么可能会重新打开显示器。移动或单击鼠标(或者可能释放按下的鼠标按钮)、按下(或释放)键、网络活动或各种其他事物可能会生成 system events which signal the power saving feature to turn the monitor back on。 (您可能会从 powershell sn-p 看到相同的结果;在这种情况下,您的鼠标单击/击键顺序可能不同。)

    【讨论】:

    • SendMessageA 通话之前,我已经使用了睡眠 2 秒。同样的事情。
    • GC 在通话后立即吃掉user32 var,你怎么看?
    • GC 不是问题,实例在延迟范围内仍然存在。我已经看到其他关于即使使用 powershell 也会暂时关闭显示器的报告。可能想要检查计算机的节能设置(例如,插入时“从不睡眠”可能会覆盖关闭它。)这里的重点是我相信代码正在关闭显示器。重新开启是一个单独的问题。
    • 你是对的。它工作了几次。但这非常难以预测。
    • 不可预知的是唤醒事件。您是否启用了局域网唤醒功能?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 2022-10-21
    相关资源
    最近更新 更多