Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,是否可以监听外部监视器的连接/断开?_Java_Windows_Macos_Event Listener_External Display - Fatal编程技术网

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

在Java中,是否可以监听外部监视器的连接/断开?,java,windows,macos,event-listener,external-display,Java,Windows,Macos,Event Listener,External Display,在断开外部显示器与笔记本电脑的连接后,我会丢失一些应用程序,因为断开连接的显示器仍然设置为默认设置。我的某些窗口试图在断开连接的监视器上显示 我有一个解决办法,比如右键单击应用程序图标并选择移动,然后使用箭头键将窗口移动到我的笔记本电脑上。我想知道Java中是否有办法监听断开连接,然后将默认屏幕重置为笔记本电脑 我想获取启动时可用的屏幕的数量和ID,并将它们添加到属性文件中。如果屏幕断开连接,请再次获取可用屏幕的数量和ID,并将这些值与我的属性文件中的值进行比较。然后,我可以将默认值设置为与新值

在断开外部显示器与笔记本电脑的连接后,我会丢失一些应用程序,因为断开连接的显示器仍然设置为默认设置。我的某些窗口试图在断开连接的监视器上显示

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

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

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

AWT提供给您的信息,尽管“外部”是主观的,因为您可能有两个内置监视器或两个外部监视器

在基本级别上,您可以随时对监控器进行计数:

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);
int numberOfMonitors=0;
GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[]gs=ge.getScreenDevices();
对于(int j=0;j
要检测新监视器的附件,您需要轮询结果


这是一个纯Java解决方案;据我所知,如果您想要比这更准确的东西,那么您可能需要调用目标平台上的一些本机工具。例如,在Linux中。

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

您正在询问如何检测监视器是否已连接或断开:

在Windows下,您可以通过连接挂机

也许一个想法是不时检查并检测变化,但这与其说是真正的解决方案,不如说是一种变通方法

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


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

如果您的Java应用程序针对Windows,那么有一个硬件解决方案

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

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


(这是我在装有NVIDIA/HP GPU/monitors,YMMV的Windows 10机箱上的体验)

谢谢您,好心的先生。我将仔细阅读这些类,并使用您的代码,看看它会把我引向何方。