使用Java收集特定系统信息:监视器(屏幕)详细信息

使用Java收集特定系统信息:监视器(屏幕)详细信息,java,Java,我知道用Java获取系统信息是可能的,所以我搜索了这个特定的问题,但结果是空的 问题: 我可以收集所有连接的监视器的完整系统信息吗?特别是我希望得到一个唯一的ID,型号,或每个显示器的制造商 例如,Wayan Saryada在这里演示了一个简单的示例,该示例获取有关所有连接监控器的基本信息。以下代码可防止链路损坏: // // Get local graphics environment // GraphicsEnvironment env = GraphicsE

我知道用Java获取系统信息是可能的,所以我搜索了这个特定的问题,但结果是空的

问题: 我可以收集所有连接的监视器的完整系统信息吗?特别是我希望得到一个唯一的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地址;我知道那不是一件事。例如,在三重监视器设置中,这样我的应用程序就知道该怎么做。然后,如果我删除一个监视器,它就会知道要更改什么。

只需查看GraphicsDeviceAPI:


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

显示0, 显示屏1, 显示器2 ……等等

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

一个解决方案 这并没有解决我最初的问题:OP的问题。然而,我知道用Java获取完整的人类可读系统信息非常困难,尤其是所有连接的监视器。我向GitHub上的用户发出请求,他能够将此功能添加到。他的Java库将您需要了解的关于每个连接到计算机上的监视器的所有信息都收集到了计算机上。一个完美的网络管理员一体化解决方案

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


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

我已经阅读并测试了GraphicsDevice API。getIDString仅返回基本信息,如Display0和Display1。例如,对于3+个监视器,只需以不同的顺序插入它们,就会更改分配给它们的ID。