2012-03-22 19 views
5

我們正在編寫一個程序,該程序必須能夠將設置推送到特定的顯示器,並要求我們爲每個顯示設備設置唯一的標識符。到目前爲止,我能得到的最好的結果是查詢由EnumDisplayDevices返回的DEVMODE結構的句柄,並查看返回的DISPLAY_DEVICE名稱是否包含「DISPLAY1」或「DISPLAY2」(我們只支持兩個監視器,並且該設備名稱DISPLAY_DEVICE結構體的字段的形式是\。\ DISPLAYx,其中x是自然數,最小值爲1)。窗口如何分配顯示設備名稱? (如\。 DISPLAY1)並確定顯示端口?

我的問題是,如果有人將設置從一個終端應用到另一個終端並實際上說:「將DISPLAY1中的所有設置和我的DISPLAY2中的所有設置應用於其他終端的DISPLAY1和DISPLAY2」它將設置應用於連接到相應端口的監視器?據我所知,如果只連接了1臺監視器,則該監視器將被分配名稱\。\ DISPLAY1,如果連接了兩個,則通過DVI連接的顯示設備是\。\ DISPLAY1,VGA上的設備是\。\ DISPLAY2。

我試過一次拔下一個顯示器,以不同的順序重新連接它們,重新啓動,只有一個連接重新啓動,然後連接第二個等等,而且它似乎總是以這種方式分配它們。我似乎無法將它們分配給相反的名字。如果是這種情況,那麼我們應該沒問題。

或者,如果有人知道使用MSDN調用以編程方式確定顯示器連接到哪個端口(DVI或VGA等),那將更有幫助。基本上我已經用盡了所有可以解決這個問題的方法。

基本上,我問,我是否正確地假設了Windows 7如何爲顯示器分配名稱?如果不是,它是如何完成的?有沒有辦法改變它?如果是這樣,怎麼樣?有沒有辦法確定監視器連接的端口?

順便說一句,這個應用程序是使用Qt編寫的,如果這很重要的話。

謝謝。

-Alex又名LeapDayWilliam

+0

我覺得這很有趣,沒有關於這方面的文檔,也沒有人似乎知道答案,但我很欣賞所有的觀點。 – LeapDayWilliam 2012-03-23 14:27:36

回答

1

我認爲你在尋找什麼是一些代碼,以幫助您監控的規範名稱與其物理位置聯繫起來。您正在尋找一種解決方案,您可以通過查看顯示器的設備名稱來進行確定,但這不是一種準確或可靠的方法。根據我的經驗,對於監視器設備名稱的編號方案沒有韻或理由。您真正需要的是確定哪個顯示器實際位於哪裏的方法。

下面是一些非常基本的代碼,用於打印出您感興趣的顯示器的虛擬像素位置的X,Y座標。您會注意到,如果您有兩個(或更多)顯示器,X值這些顯示器將根據左側顯示器的寬度增加。您可以根據此信息計算顯示器的物理位置。

BOOL CALLBACK enumMonitorCallback(
    __in HMONITOR hMonitor, 
    __in HDC hdcMonitor, 
    __in LPRECT lprcMonitor, 
    __in LPARAM dwData 
) 
{ 
    printf("Monitor: %p (X,Y): (%d,%d) (Width, Height): (%d,%d) \n", hMonitor, lprcMonitor->left, lprcMonitor->top, lprcMonitor->right - lprcMonitor->left, lprcMonitor->bottom - lprcMonitor->top); 
    return TRUE; 
} 

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    int nRetCode = 0; 
    BOOL res = EnumDisplayMonitors(NULL, NULL, enumMonitorCallback, NULL); 
    getchar(); 
    return nRetCode; 
} 

我的機器有兩臺顯示器。我得到這樣的輸出:

Monitor: 0x00C005E1 (X,Y): (0,0) (Width, Height): (1280,1024) 
    Monitor: 0x00020001 (X,Y): (1280,0) (Width, Height): (1280,1024) 

,告訴我說,監視器,手柄0x00020001位於到第一臺顯示器的右側,由監視器(1280px)的分辨率抵消。

我希望有幫助。