【问题标题】:In Java, is it possible to listen for the connection/disconnection of an external Monitor?在 Java 中,是否可以监听外部监视器的连接/断开连接?
【发布时间】:2014-01-07 07:40:12
【问题描述】:

从我的笔记本电脑断开外接显示器后,我丢失了一些应用程序,因为断开连接的显示器仍设置为默认值。我的一些窗口正试图在断开连接的显示器上显示。

我有一个解决方法,例如右键单击应用程序图标并选择移动,然后使用箭头键将窗口移动到我的笔记本电脑。我想知道 Java 中是否有办法监听断开连接,然后将我的默认屏幕重置为我的笔记本电脑。

我考虑获取启动时可用的屏幕的数量和 ID,并将它们添加到属性文件中。如果屏幕断开连接,请再次获取可用屏幕的数量和 ID,并将这些值与我的属性文件中的值进行比较。然后我可以将默认值设置为与新值和存储值匹配的屏幕。

我还没有开始编写代码。在这一点上,这比任何事情都更具调查性。

【问题讨论】:

    标签: java windows macos event-listener external-display


    【解决方案1】:

    AWT 为您提供access to screen information,尽管“外部”是主观的,因为您可能有 2 个内置显示器或 2 个外部显示器。

    在基本层面上,您可以随时统计监视器:

    int numberOfMonitors = 0;
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice[] gs = ge.getScreenDevices();
    for (int j = 0; j < gs.length; j++) {
        GraphicsDevice gd = gs[j];
        GraphicsConfiguration[] gc = gd.getConfigurations();
        if (gc.getType() == TYPE_RASTER_SCREEN) numberOfMonitors++;
    }
    System.out.println("Number of monitors: " + numberOfMonitors);
    

    要检测新监视器的连接,您需要轮询结果。

    这是一个纯Java解决方案;据我所知,如果您想要比这更准确的东西,那么您可能需要在您的目标平台上调用一些本机工具。例如,probing sysfs 在 Linux 中。

    【讨论】:

    • 谢谢您,先生。我会稍微阅读一下这些类并使用你的代码,看看它会把我引向何方。
    【解决方案2】:

    基本上我会说这很难或不可能仅使用Java。原因是 Java 是一种跨平台语言,所有这些都由底层操作系统处理。请记住,很难为这个问题找到一个强大的跨平台解决方案。

    您问的是如何检测监视器是连接还是断开:

    在 Windows 下,您可以通过 Java Native Access 连接 WM_DEVICECHANGE

    也许一个想法是不时检查getScreenDevices() 并检测更改,但这与其说是真正的解决方案,不如说是一种解决方法。

    您还询问如何更改主显示。 There 是一个如何使用 WinAPI 执行此任务的示例。

    对于其他操作系统,您需要找到其他方法。我希望这个答案能给出一个想法,这可能很难解决,尤其是使用 Java。

    【讨论】:

      【解决方案3】:

      如果您的 Java 应用程序面向 Windows,则有一种硬件解决方法。

      使用 DisplayPort 电缆连接显示器可让 Windows 知道显示器何时关闭(无论是通过电源按钮还是断开的电缆)。当 Windows 检测到监视器脱机时,它会将断开连接的监视器中的所有窗口移动到保持打开的屏幕上。无需额外编码。虽然是一个有限的用例,但如果您可以控制硬件,这可以为您省去一些麻烦。

      另一方面,如果您编写自己的解决方案,最好在这种设置上测试您的解决方案,以确保 Windows 移动窗口和您的软件移动窗口的结果不会导致不需要的行为.

      (这是我在带有 NVIDIA/HP GPU/显示器,YMMV 的 Windows 10 机器上的体验)

      【讨论】:

        猜你喜欢
        • 2021-10-14
        • 2013-01-23
        • 1970-01-01
        • 2020-02-18
        • 2021-04-26
        • 2013-08-26
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        相关资源
        最近更新 更多