2008-10-24 52 views

回答

13

MSDN Device Context Functions

什麼你基本上需要做的:

使用EnumDisplayDevices()API調用 枚舉顯示設備上 系統並尋找那些 沒有 DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 標誌設置(這將包括任何 鏡像設備,這樣不是所有會 物理顯示器)。一旦你找到 你需要得到 有效的顯示模式,將其更改爲顯示設備, 你可以通過調用 EnumDisplaySettingsEx()API調用發現這 - 通常你會顯示所有可用的 模式和允許用戶選擇 不過你的情況聽起來 這樣可能可以硬編碼 和保存你額外的一步。對於 的面向未來的你 應用程序,雖然我建議有此 易於改變,而無需通過 源每次挖起見, 註冊表項將是顯而易見的 選擇。一旦你已經得到了整理出來 填充與信息有關 顯示器定位(設置 PelsWidth /高度,位置, DisplayFrequency和BitsPerPel 屬性),那麼在 領域的成員設置這些標誌一個DevMode的顯示 結構。最後通過 設置結構調用 ChangeDisplaySettingsEx(),並確保發送 重置和更新註冊表標誌。 這應該是你所需要的,希望這有助於 ,

DISPLAY_DEVICE結構導入使用的PInvoke

EnumDisplayDevices函數導入

EnumDisplaySettingsEx函數導入

等他們休息功能可以通過名稱進行簡單的搜索即可找到。

+0

嗨爸爸,我可以用你的方法如果輔助顯示器已經啓用,但我可以」用它來打開第二種方法,它總是失敗。這種方法應該能夠做到這一點? – 2008-10-27 14:25:06

+0

這可能是驅動程序特定問題,當api設置了一些有效的顯示器設置時,驅動程序不會自動啓用顯示器。在我的情況下,我正在使用一些舊的Matrox卡,而我沒有這個問題。查看一些特定的製造商文檔可能很有用。 – 2008-10-27 14:50:55

2

我沒有完整的答案在這裏,但我幾乎可以肯定,你將不得不調出淨的做到這一點。你將不得不使用Pinvoke來調用一個非託管的dll。一個很好的資源是pinvoke.net。

我做了快速搜索,發現http://www.pinvoke.net/default.aspx/user32/ChangeDisplaySettings.html這可能是不是你想要什麼,但你可能會發現它的地方在pinvoke.net

1

我正在尋找相同的解決方案。我寫了下面的代碼來調用ChangeDisplaySettingsEx用的PInvoke:

DEVMODE dm = new DEVMODE(); 
dm.dmSize = (short)Marshal.SizeOf(dm); 
dm.dmPelsWidth = 1680; 
dm.dmPelsHeight = 1050; 
dm.dmBitsPerPel = 32; 
dm.dmDisplayFrequency = 60; 
dm.dmFields = DevModeFields.DM_BITSPERPEL | DevModeFields.DM_PELSWIDTH | 
       DevModeFields.DM_PELSHEIGHT | DevModeFields.DM_DISPLAYFREQUENCY; 
int res = ChangeDisplaySettingsEx(@"\\.\DISPLAY2", ref dm, IntPtr.Zero, CDS_RESET | CDS_UPDATEREGISTRY, IntPtr.Zero); 
Console.WriteLine("result = " + res.ToString()); 

如果顯示器已經啓用,這改變成功的決議。但是,如果顯示器未連接到桌面,則不會激活它。那麼有沒有人有一個可以工作的代碼示例?

11

如果您有Windows 7,那麼就啓動一個進程:

private static Process DisplayChanger = new Process 
    { 
     StartInfo = 
     { 
      CreateNoWindow = true, 
      WindowStyle = ProcessWindowStyle.Hidden, 
      FileName = "DisplaySwitch.exe", 
      Arguments = "/extend" 
     } 
    }; 

然後DisplayChanger.Start();

1

要啓用一個顯示器,設置其位置,其他的東西比0,0一樣,如圖所示:

POINTL enabledPosition = new POINTL(); 
enabledPosition.x = -1280; 
enabledPosition.y = 0; 

dm.dmPosition = enabledPosition; 
dm.dmFields = DM.Position; 
res = ChangeDisplaySettingsEx(d.DeviceName, ref dm, IntPtr.Zero, (uint) DeviceFlags.CDS_UPDATEREGISTRY, IntPtr.Zero); 
相關問題