是否有可能以編程方式啓用第二個監視器並將C#中的Windows桌面擴展到它上面?它需要做相當於打開下圖中的複選框。如何在C#中啓用第二臺顯示器?
alt text http://i38.tinypic.com/27y8nt5.png
是否有可能以編程方式啓用第二個監視器並將C#中的Windows桌面擴展到它上面?它需要做相當於打開下圖中的複選框。如何在C#中啓用第二臺顯示器?
alt text http://i38.tinypic.com/27y8nt5.png
什麼你基本上需要做的:
使用EnumDisplayDevices()API調用 枚舉顯示設備上 系統並尋找那些 沒有
DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
標誌設置(這將包括任何 鏡像設備,這樣不是所有會 物理顯示器)。一旦你找到 你需要得到 有效的顯示模式,將其更改爲顯示設備, 你可以通過調用 EnumDisplaySettingsEx()API調用發現這 - 通常你會顯示所有可用的 模式和允許用戶選擇 不過你的情況聽起來 這樣可能可以硬編碼 和保存你額外的一步。對於 的面向未來的你 應用程序,雖然我建議有此 易於改變,而無需通過 源每次挖起見, 註冊表項將是顯而易見的 選擇。一旦你已經得到了整理出來 填充與信息有關 顯示器定位(設置 PelsWidth /高度,位置, DisplayFrequency和BitsPerPel 屬性),那麼在 領域的成員設置這些標誌一個DevMode的顯示 結構。最後通過 設置結構調用 ChangeDisplaySettingsEx(),並確保發送 重置和更新註冊表標誌。 這應該是你所需要的,希望這有助於 ,
DISPLAY_DEVICE結構導入使用的PInvoke
等他們休息功能可以通過名稱進行簡單的搜索即可找到。
我沒有完整的答案在這裏,但我幾乎可以肯定,你將不得不調出淨的做到這一點。你將不得不使用Pinvoke來調用一個非託管的dll。一個很好的資源是pinvoke.net。
我做了快速搜索,發現http://www.pinvoke.net/default.aspx/user32/ChangeDisplaySettings.html這可能是不是你想要什麼,但你可能會發現它的地方在pinvoke.net
我正在尋找相同的解決方案。我寫了下面的代碼來調用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());
如果顯示器已經啓用,這改變成功的決議。但是,如果顯示器未連接到桌面,則不會激活它。那麼有沒有人有一個可以工作的代碼示例?
如果您有Windows 7,那麼就啓動一個進程:
private static Process DisplayChanger = new Process
{
StartInfo =
{
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden,
FileName = "DisplaySwitch.exe",
Arguments = "/extend"
}
};
然後DisplayChanger.Start();
要啓用一個顯示器,設置其位置,其他的東西比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);
嗨爸爸,我可以用你的方法如果輔助顯示器已經啓用,但我可以」用它來打開第二種方法,它總是失敗。這種方法應該能夠做到這一點? – 2008-10-27 14:25:06
這可能是驅動程序特定問題,當api設置了一些有效的顯示器設置時,驅動程序不會自動啓用顯示器。在我的情況下,我正在使用一些舊的Matrox卡,而我沒有這個問題。查看一些特定的製造商文檔可能很有用。 – 2008-10-27 14:50:55