none
デェアルディスプレイ拡張表示の方法 RRS feed

  • 質問

  • こんにちは

    現在、ディアルディスプレイ(2台、2台ともタッチパネル)を利用し、片方には係員操作部、もう一方には顧客操作部を作っています。

    係員操作部は常時表示ですが、顧客操作部は顧客から情報入力時のみ電源をONにし、情報入力終了後には、画面の電源をOFFにするように設計して作っている最中ですが、初めてすることで、いろいろ調べてみましたが、どうすればいいかわからない状況です。

    ご存知の方がおられましたら、教えていただけますでしょうか?

    2016年6月12日 16:23

すべての返信

  • Windows7以降であれば以下のコマンドでディスプレイの「拡張表示」と「単一PC画面のみ」を切り替えられるようですが、使えますでしょうか?

    拡張表示
    DisplaySwitch.exe /extend

    単一PC画面のみ
    DisplaySwitch.exe /internal

    APIで実現するには ChangeDisplaySettingsEx 関数で実現できるかもしれません。 (すみません検証を行っていません・・・)

    複数モニタ環境で、「モニターを切り離すには DEVMODE.dmPelsWidth と DEVMODE.dmPelsHeight にゼロに設定します。」と記述されていました。

    参考ページ: https://msdn.microsoft.com/en-us/library/dd183413(v=vs.85).aspx


    2016年6月13日 1:33
  • 言語も何も書いていないので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!)

    2016年6月13日 3:46