-1

すべてのディスプレイ名とモニター名を表示する関数を作成しようとしています。しかし、enumDisplayDevices を 2 回目に呼び出すと、最初の引数が lpDisplayDevice.DeviceName の場合、エラーが発生します。代わりに「IntPtr.Zero」に設定されている場合、エラーは発生しないため、それが最初の引数であることはわかっています。

C# でこれを行う方法の別の例が見つかりません。

    public static void show_display_devices()
    {
        DISPLAY_DEVICE lpDisplayDevice = new DISPLAY_DEVICE(0);     // OUT
        int devNum = 0;
        while(true)
        {
            bool success = EnumDisplayDevices( IntPtr.Zero,  devNum,  ref lpDisplayDevice,  0);
            if( !success )
                break;

            Console.WriteLine("\ndevNum =" + devNum);
            Console.WriteLine("cb =" + lpDisplayDevice.cb);
            Console.WriteLine("DeviceID =" + lpDisplayDevice.DeviceID);
            Console.WriteLine("DeviceKey =" + lpDisplayDevice.DeviceKey);
            Console.WriteLine("DeviceName =" + lpDisplayDevice.DeviceName.Trim());
            Console.WriteLine("DeviceString =" + lpDisplayDevice.DeviceString.Trim());
            // Show monitor name:
            DISPLAY_DEVICE monitor_name = new DISPLAY_DEVICE(0);        // OUT

               >>>>>>>>>>>   NEXT LINE HAS ERROR:  <<<<<<<<<<<<<<<
            EnumDisplayDevices(lpDisplayDevice.DeviceName, 0, ref monitor_name, 0);  <<<<<<<<<<<<<<<<<  "lpDisplayDevice.DeviceName" causes error  <<<<<<
                               ^^^^^^^^^^^^^^^^^^^^^^^^^^ - CAUSES ERROR <<<<<<

            Console.WriteLine("Monitor name =" + lpDisplayDevice.DeviceString.Trim());

            ++devNum;
        }
    }
4

1 に答える 1

0

問題は、「private static extern bool EnumDisplayDevices()」の宣言にありました。lpDevice を IntPtr から string に変更したところ、うまくいきました。

以下のソース コードでは、[出力] ウィンドウに次のように表示されます。

devNum =0 cb =424 DeviceID =PCI\VEN_10DE&DEV_0402&SUBSYS_0440196E&REV_A1 DeviceKey =\Registry\Machine\System\CurrentControlSet\Control\Video{B757E378-AF2E-4826-BA9E-927C5B81B139}\0000 DeviceName =\.\DISPLAY1 DeviceString =NVIDIA GeForceスレッド 'RunPowerStatusMonitor Thread' (0x2108) がコード 0 (0x0) で終了しました。モニター名 = Generic PnP Monitor

devNum =1 cb =424 DeviceID =PCI\VEN_10DE&DEV_0402&SUBSYS_0440196E&REV_A1 DeviceKey =\Registry\Machine\System\CurrentControlSet\Control\Video{B757E378-AF2E-4826-BA9E-927C5B81B139}\0001 DeviceName =\.\DISPLAY2 DeviceString =NVIDIA GeForceモニター名 = Generic PnP Monitor

        public static void show_display_devices()
    {
        DISPLAY_DEVICE lpDisplayDevice = new DISPLAY_DEVICE(0);     // OUT
            DISPLAY_DEVICE monitor_name = new DISPLAY_DEVICE(0);        // OUT

        int devNum = 0;
        while (EnumDisplayDevices(null, devNum, ref lpDisplayDevice, 0))
        {

            Console.WriteLine("\ndevNum =" + devNum);
            Console.WriteLine("cb =" + lpDisplayDevice.cb);
            Console.WriteLine("DeviceID =" + lpDisplayDevice.DeviceID);
            Console.WriteLine("DeviceKey =" + lpDisplayDevice.DeviceKey);
            Console.WriteLine("DeviceName =" + lpDisplayDevice.DeviceName.Trim());
            Console.WriteLine("DeviceString =" + lpDisplayDevice.DeviceString.Trim());
            // Show monitor name:



            EnumDisplayDevices( lpDisplayDevice.DeviceName, 0, ref monitor_name, 0);
            Console.WriteLine("Monitor name =" + monitor_name.DeviceString.Trim());

            ++devNum;
        }
    }

    [DllImport("User32.dll")]
    private static extern bool EnumDisplayDevices(
        string lpDevice, int iDevNum,
        ref DISPLAY_DEVICE lpDisplayDevice, int dwFlags);




    [StructLayout(LayoutKind.Sequential)]
    public struct DISPLAY_DEVICE
    {
        public int cb;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string DeviceName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceString;
        public int StateFlags;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceID;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
        public string DeviceKey;

        public DISPLAY_DEVICE(int flags)
        {
            cb = 0;
            StateFlags = flags;
            DeviceName = new string((char)32, 32);
            DeviceString = new string((char)32, 128);
            DeviceID = new string((char)32, 128);
            DeviceKey = new string((char)32, 128);
            cb = Marshal.SizeOf(this);
        }
    }
于 2013-04-24T19:56:32.137 に答える