質問者
デェアルディスプレイ拡張表示の方法

質問
すべての返信
-
Windows7以降であれば以下のコマンドでディスプレイの「拡張表示」と「単一PC画面のみ」を切り替えられるようですが、使えますでしょうか?
拡張表示
APIで実現するには ChangeDisplaySettingsEx 関数で実現できるかもしれません。 (すみません検証を行っていません・・・)
DisplaySwitch.exe /extend
単一PC画面のみ
DisplaySwitch.exe /internal
複数モニタ環境で、「モニターを切り離すには DEVMODE.dmPelsWidth と DEVMODE.dmPelsHeight にゼロに設定します。」と記述されていました。
参考ページ: https://msdn.microsoft.com/en-us/library/dd183413(v=vs.85).aspx- 編集済み kenjinoteMVP 2016年6月13日 1:35
-
言語も何も書いていないのでWinForms C#でSetDisplayConfigを使って書いてみる
namespace WindowsFormsApplication1 { using System; using System.Linq; using System.Windows.Forms; public partial class Form1 : Form { public Form1() { InitializeComponent(); int y = 0; foreach (MultiScreenTool.Topology topology in Enum.GetValues(typeof(MultiScreenTool.Topology))) { RadioButton radio = new RadioButton(); radio.Top = y; radio.Tag = topology; radio.Text = topology.ToString(); radio.AutoSize = true; radio.CheckedChanged += (s, e) => { RadioButton r = (RadioButton)s; if (r.Checked) { MultiScreenTool.SetTopology((MultiScreenTool.Topology)r.Tag); } }; this.Controls.Add(radio); y += radio.Height; } } } class MultiScreenTool { private enum SDC : uint { SDC_TOPOLOGY_INTERNAL = 0x00000001, SDC_TOPOLOGY_CLONE = 0x00000002, SDC_TOPOLOGY_EXTEND = 0x00000004, SDC_TOPOLOGY_EXTERNAL = 0x00000008, SDC_TOPOLOGY_SUPPLIED = 0x00000010, SDC_USE_DATABASE_CURRENT = (SDC_TOPOLOGY_INTERNAL | SDC_TOPOLOGY_CLONE | SDC_TOPOLOGY_EXTEND | SDC_TOPOLOGY_EXTERNAL), SDC_USE_SUPPLIED_DISPLAY_CONFIG = 0x00000020, SDC_VALIDATE = 0x00000040, SDC_APPLY = 0x00000080, SDC_NO_OPTIMIZATION = 0x00000100, SDC_SAVE_TO_DATABASE = 0x00000200, SDC_ALLOW_CHANGES = 0x00000400, SDC_PATH_PERSIST_IF_REQUIRED = 0x00000800, SDC_FORCE_MODE_ENUMERATION = 0x00001000, SDC_ALLOW_PATH_ORDER_CHANGES = 0x00002000, } public enum Topology : uint { SDC_TOPOLOGY_INTERNAL = SDC.SDC_TOPOLOGY_INTERNAL, SDC_TOPOLOGY_CLONE = SDC.SDC_TOPOLOGY_CLONE, SDC_TOPOLOGY_EXTEND = SDC.SDC_TOPOLOGY_EXTEND, SDC_TOPOLOGY_EXTERNAL = SDC.SDC_TOPOLOGY_EXTERNAL, } [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern UInt32 SetDisplayConfig(UInt32 numPathArrayElements, IntPtr pathArray, UInt32 numModeInfoArrayElements, IntPtr modeInfoArray, SDC flags); public static System.Windows.Forms.Screen[] GetScreens() { var fields = typeof(System.Windows.Forms.Screen).GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static) .Where(_ => _.FieldType == typeof(System.Windows.Forms.Screen[])).ToArray(); if (fields.Length == 1) { fields[0].SetValue(null, null); } return System.Windows.Forms.Screen.AllScreens; } public static void SetTopology(Topology topology) { SetDisplayConfig(0, IntPtr.Zero, 0, IntPtr.Zero, (SDC)topology | SDC.SDC_APPLY); } public static void Test() { foreach (Topology topology in new[] { Topology.SDC_TOPOLOGY_INTERNAL, Topology.SDC_TOPOLOGY_EXTERNAL, Topology.SDC_TOPOLOGY_CLONE, Topology.SDC_TOPOLOGY_EXTEND }) { Console.WriteLine(topology); SetTopology(topology); foreach (System.Windows.Forms.Screen sc in GetScreens()) { System.Diagnostics.Debug.WriteLine("{0}\t{1} ", sc.Primary, sc.Bounds); } System.Threading.Thread.Sleep(1000); } } } }
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)