【问题标题】:Using Java to gather specific system information: monitor (screen) details使用 Java 收集特定系统信息:监控(屏幕)详细信息
【发布时间】:2015-12-23 07:52:14
【问题描述】:

我知道可以在 Java 中获取系统信息,并且已经在 SO 中搜索过这个特定问题,但结果为空。

问题:
我可以收集有关所有连接的监视器的完整系统信息吗?特别是我希望获得每台显示器的唯一 ID、型号或制造商。

例如,Wayan Saryada 在此处演示了一个简单示例,该示例获取有关所有已连接监视器的基本信息。以下代码可防止链接失效:

    //
    // Get local graphics environment
    //
    GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();

    GraphicsDevice[] devices = env.getScreenDevices();

    int sequence = 1;
    for (GraphicsDevice device : devices) {
        System.out.println("Screen Number [" + (sequence++) + "]");
        System.out.println("Width       : " + device.getDisplayMode().getWidth());
        System.out.println("Height      : " + device.getDisplayMode().getHeight());
        System.out.println("Refresh Rate: " + device.getDisplayMode().getRefreshRate());
        System.out.println("Bit Depth   : " + device.getDisplayMode().getBitDepth());
        System.out.println("");
    }

然而,这段代码没有产生任何独特的东西。它只是有用的通用信息,但不符合我的最终目标。

用例/最终目标:
我的目的是制作一个可跟踪(检测)您正在使用的计算机/计算机设置并显示适当桌面的便携式应用程序。一个例子是在我的带有大显示器的工作计算机上,它以一种方式布置我的桌面,然后在我的笔记本电脑上它隐藏了一些东西;长话短说,它将显示一个备用桌面显示(更少的图标,只有我需要的工作/家庭)。

我已经解决了所有额外的问题,但我需要一种方法来跟踪我使用的计算机以及当时连接的显示器。本质上是附加监视器的“MAC地址”;我知道那不是一回事。例如,在三重监视器设置上,这种方式我的应用程序知道什么在哪里。然后,如果我移除一台显示器,它就会知道要更改什么。

【问题讨论】:

    标签: java


    【解决方案1】:

    长话短说,在 Java 中无法准确检测 GraphicsDevice API 中的哪个监视器。还有其他几种方法可以检测此信息,但 Java 又遇到了同样的问题。 Java 只是自动增加它找到的监视器,如下所示:

    显示0, 显示1, 显示器2 ...等等。

    每次计算机打开时,都会发生不同的显示器分配,每次关闭显示器时,顺序都会发生变化。如果图形驱动程序在使用时崩溃或重新启动,情况也是如此。

    一个解决方案
    这不能解决我原来的问题:OP 的问题。但是我知道使用 Java 获取完整的人类可读系统信息非常困难,尤其是所有连接的监视器。我在 GitHub 上向dbwiddis 提出了请求,他能够将此功能添加到Oshi。他的 Java 库将您需要了解的有关每个连接的监视器的所有信息都提取到计算机上。网络管理员的完美多合一解决方案。

    问题仍然存在/破解
    仍然没有办法(包括使用可通过其他编程语言访问的其他 API)来检测哪个监视器是哪个监视器。如果您愿意,所有连接的显示器的“MAC 地址”。可靠地做到这一点(真的是黑客)的唯一方法是弹出一个输出信息的终端,然后您可以使用 Java 获取这些信息。这样,Java 可以手动进行匹配。它可以输出到 Display2 并读取其上打开的终端窗口,现在我们知道哪个显示器是 Display2。

    我现在没有这方面的代码,因为它非常不可靠并且不能保证跨操作系统兼容。它在 Windows 中应该可以正常工作,但您需要执行批处理文件或 powershell 脚本才能在所需的监视器上获取终端。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 我已经阅读并测试了 GraphicsDevice API。 getIDString() 只返回Display0 和Display1 等基本信息。例如,对于 3 个以上的显示器,只需以不同的顺序插入它们就会改变分配给它们的 ID。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多