我这哪错了,谁帮看看,谢谢。前面我是从网上粘的,exeColorDepth()是我写的,另外我把DEVMODE结构中添加了一个  public const int DM_BITSPERPEL = 32;
运行返回值是 DISP_CHANGE_SUCCESSFUL ,但是实际却没改成功。
谁帮我看看哪错了?using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace ChangeColordepth
{
    class ForColorDepth
    {
        enum ChangeReturnValue
        {
            DISP_CHANGE_SUCCESSFUL = 0,
            DISP_CHANGE_RESTART = 1,
            DISP_CHANGE_FAILED = -1,
            DISP_CHANGE_BADMODE = -2,
            DISP_CHANGE_NOTUPDATED = -3,
            DISP_CHANGE_BADFLAGS = -4,
            DISP_CHANGE_BADPARAM = -5,
            DISP_CHANGE_BADDUALVIEW = -6
        }
        public enum DMDO
        {
            DEFAULT = 0,
            D90 = 1,
            D180 = 2,
            D270 = 3
        }
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct DEVMODE
        {
            public const int DM_DISPLAYFREQUENCY = 0x400000;
            public const int DM_PELSWIDTH = 0x80000;
            public const int DM_PELSHEIGHT = 0x100000;
            public const int DM_BITSPERPEL = 32;
            private const int CCHDEVICENAME = 32;
            private const int CCHFORMNAME = 32;            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
            public string dmDeviceName;
            public short dmSpecVersion;
            public short dmDriverVersion;
            public short dmSize;
            public short dmDriverExtra;
            public int dmFields;            public int dmPositionX;
            public int dmPositionY;
            public DMDO dmDisplayOrientation;
            public int dmDisplayFixedOutput;            public short dmColor;
            public short dmDuplex;
            public short dmYResolution;
            public short dmTTOption;
            public short dmCollate;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)]
            public string dmFormName;
            public short dmLogPixels;
            public int dmBitsPerPel;
            public int dmPelsWidth;
            public int dmPelsHeight;
            public int dmDisplayFlags;
            public int dmDisplayFrequency;
            public int dmICMMethod;
            public int dmICMIntent;
            public int dmMediaType;
            public int dmDitherType;
            public int dmReserved1;
            public int dmReserved2;
            public int dmPanningWidth;
            public int dmPanningHeight;
          
        }
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            static extern ChangeReturnValue ChangeDisplaySettings([In] ref DEVMODE lpDevMode, int dwFlags);            public void exeColorDepth()
            {
                DEVMODE curDevMode = new DEVMODE();
                curDevMode.dmBitsPerPel=32;
                curDevMode.dmFields = DEVMODE.DM_BITSPERPEL;
                curDevMode.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));              
                ChangeReturnValue retVal = ChangeDisplaySettings(ref curDevMode, 1);                Console.WriteLine(retVal.ToString() + curDevMode.dmBitsPerPel);       
            }            }
}

解决方案 »

  1.   

    谁对这个特别懂的最好再帮讲讲,StructLayout,MarshalAs什么的我都是直接搬的,看不懂。DEVMODE结构中一堆东西我都不知道哪个必须要留,哪个目前这程序没关系。分不够可以再加。
      

  2.   

    你不应该在系统定义好的结构中添加成员,
    因为这样会使得这个结构不再被系统识别,所以不能加这个成员:
    public const int DM_BITSPERPEL = 32;
    除非系统的结构中确实有这个成员。
      

  3.   

    我虽然不能说的太明白,但是楼主可以看一下这个文章是否有帮助。用C#列举显示器可用设置列表并进行设置 
    http://blog.csdn.net/hbxtlhx/archive/2007/03/15/1530434.aspx
      

  4.   


    PInvoke.NET Visual Studio 插件
    flankerfc 著于2007-10-10 2:27:15
    在. NET中,有时要使用一些非托管代码,如Win32 API之类的。可以通过.NET 的 Platform Invoke(PInvoke)机制来完成。但是PInvoke 需要程序员提供函数声明,这点比较麻烦且有可能出错。PInvoke.NET将帮你避免错误,提高效率。