2014-01-07 80 views
1

從我的筆記本電腦斷開外部顯示器時,由於斷開連接的顯示器仍被設置爲默認設置,因此我丟失了一些應用程序。我的一些窗口正試圖在斷開連接的顯示器上顯示。在Java中,是否可以監聽外部監視器的連接/斷開連接?

我有一個解決方法,比如右鍵單擊應用程序圖標並選擇移動,然後使用箭頭鍵將窗口移動到我的筆記本電腦。我想知道是否有方法在Java中偵聽斷開連接,然後將我的默認屏幕重置爲我的筆記本電腦。

我想過要獲取啓動時可用屏幕的數量和ID,並將它們添加到屬性文件中。如果屏幕斷開連接,再次獲取可用屏幕的編號和ID,並將這些值與我的屬性文件中的值進行比較。然後,我可以將默認值設置爲與新值和存儲值相匹配的屏幕。

我還沒有開始編碼呢。在這一點上,這比任何事情都要調查得多。

回答

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

+0

謝謝你,親切的先生。我會仔細閱讀這些類,並使用你的代碼,看看它帶領我。 – Lambda

1

基本上我會說這是相當困難或不可能與Java做。原因是Java是一種跨平臺語言,所有這些都由底層操作系統來處理。請記住,很難找到針對此問題的強大的跨平臺解決方案。

你問如何檢測,如果監視器連接或斷開:

在Windows環境下,你可以通過Java Native AccessWM_DEVICECHANGE掛鉤。

也許一個想法是不時地檢查getScreenDevices()並檢測更改,但這比解決方案更實用。

你還問你如何改變主顯示。 There是您如何使用WinAPI執行此任務的示例。

對於其他操作系統,您需要找到其他方法。我希望這個答案提供了一個想法,這可能很難解決,特別是對於Java。