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

时间:2015-12-23 07:52:14

标签: java

我知道可以用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地址”;我知道这不是一件事。这种方式在三显示器设置上,例如我的应用程序知道什么在哪里。然后,如果我删除一个监视器,它知道要改变什么。

2 个答案:

答案 0 :(得分:0)

这么长的故事简直就是没有办法在Java中准确地检测哪个监视器是GraphicsDevice API中的哪个。还有其他几种方法可以检测到这些信息,但Java也会遇到同样的问题。 Java只是自动增加它找到的监视器:

Display0, Display1, 显示2 ......等等。

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

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

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

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

答案 1 :(得分:-1)