在Java中,是否可以监听外部监视器的连接/断开连接?

时间:2014-01-07 07:40:13

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

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

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

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

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

3 个答案:

答案 0 :(得分: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解决方案;据我所知,如果你想要比这更准确的东西那么你可能需要在你所针对的平台上调用一些原生工具。例如,Linux中的probing sysfs

答案 1 :(得分:1)

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

如果显示器已连接或断开连接,您将询问如何检测:

在Windows下,您可以通过WM_DEVICECHANGEJava Native Access挂钩。

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

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

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

答案 2 :(得分:0)

如果您要通过Java应用程序定位Windows,则可以使用硬件解决方法。

使用DisplayPort电缆连接显示器可以使Windows知道何时关闭显示器(通过电源按钮或断开的电缆)。 Windows检测到监视器脱机时,会将断开连接的监视器中的所有窗口移至保持打开的屏幕。无需额外的编码。尽管使用情况有限,但是如果您可以控制硬件,则可以为您节省一些麻烦。

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

(这是我在装有NVIDIA / HP GPU /显示器,YMMV的Windows 10盒子上的经验)