2013-10-28 48 views
5

我試圖按照MSDN given here上的說明禁用輔助監視器。如何禁用輔助監視器(使用ChangeDisplaySettingsEx)?

我想專門使用這組功能,以便與舊版本的Windows兼容。

但是,我不能設法關閉監視器。我正在運行並在Windows 7 x64上進行測試。 我得到的只是一個閃爍的屏幕。代碼能夠正確檢測顯示器 - 我設法改變分辨率並輕鬆查看顯示模式。

這裏是我的代碼(部分) - 我嘗試了很多的變化對DEVMODE

DEVMODE deleteScreenMode; 
ZeroMemory(&deleteScreenMode, sizeof(DEVMODE)); 
deleteScreenMode.dmSize = sizeof(DEVMODE); 
deleteScreenMode.dmDriverExtra = 0; 
deleteScreenMode.dmFields = DM_POSITION | DM_PELSHEIGHT | DM_PELSWIDTH; 
deleteScreenMode.dmPelsWidth = 0; 
deleteScreenMode.dmPelsHeight = 0; 

POINTL delete; 
deleteion.x=0; 
deleteion.y=0; 
deleteScreenMode.dmPosition = deleteion; 

LONG result = ChangeDisplaySettingsEx(devName, 
             &deleteScreenMode, 
             NULL, 
             CDS_UPDATEREGISTRY, 
             NULL); 
領域

有沒有人有這方面的經驗?由於

+0

根據上述文章,'dmFields'掩碼包含更多標誌。也許必須設置(和相應的字段歸零)來分離顯示器? – valdo

+0

我試過了,它沒有工作。在他們的例子中,他們使用所有可能的標誌 - 當我這樣做時,它會抱怨給定的模式是無效的。當我刪除它的DM_BITSPERPEL標誌時,它的結果不會改變。顯示器輕彈並保持活動狀態。 – Alex

回答

2

我已經決定要提前進入一個不同的問題 - 設置一個主顯示器 - 由純粹的運氣,我迷迷糊糊到溶液中。 有2個條件,以禁止未指定任何地方的監視器: 1)您不能動態禁用顯示器上 - 必須使用CDS_UPDATEREGISTRY它被寫入到註冊表中。 2)更重要的是,對於一些奇怪的原因,你必須先存儲在註冊表中(有或沒有CDS_NORESET,不要緊)的變化,並再次然後使用ChangeDisplaySettingsEx與NULL值進行更改發生。這可能有些事情要連接到相同的顯示設備兩臺顯示器,我不知道......

反正這裏是爲我工作的代碼:

result = ChangeDisplaySettingsEx(devName, &deleteScreenMode, 
             NULL, 
             CDS_UPDATEREGISTRY | CDS_NORESET , 
             NULL); 
ChangeDisplaySettingsEx (NULL, NULL, NULL, NULL, NULL); 

希望它會幫助別人某天某處。

0

類似的解決方案是在暗示這裏:

http://support.microsoft.com/kb/308216

這適用於連接屏幕。但是,即使擁有這些知識,ChangeDisplaySettingsEx關於如何分離屏幕的文檔對於需要設置的DevMode字段也是錯誤的。正如你注意到的,你不僅需要設置DM_POSITION,還需要設置DM_PELSHEIGHT | DM_PELSWIDTH。

在Windows 7中有一個新的SetDisplayConfig API,但我與它沒有親身經歷呢。希望它有更好的記錄!