1

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

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

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

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

4

3 回答 3

1

AWT 使您可以访问屏幕信息,尽管“外部”是主观的,因为您可能有 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 中探测 sysfs 。

于 2014-01-07T08:25:47.907 回答
1

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

您在询问如何检测显示器是否已连接或断开:

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

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

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

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

于 2014-01-07T08:35:49.043 回答
0

如果您使用 Java 应用程序以 Windows 为目标,则可以使用硬件解决方法。

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

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

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

于 2019-07-24T12:00:43.670 回答