我这哪错了,谁帮看看,谢谢。前面我是从网上粘的,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);
} }
}
运行返回值是 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);
} }
}
因为这样会使得这个结构不再被系统识别,所以不能加这个成员:
public const int DM_BITSPERPEL = 32;
除非系统的结构中确实有这个成员。
http://blog.csdn.net/hbxtlhx/archive/2007/03/15/1530434.aspx
PInvoke.NET Visual Studio 插件
flankerfc 著于2007-10-10 2:27:15
在. NET中,有时要使用一些非托管代码,如Win32 API之类的。可以通过.NET 的 Platform Invoke(PInvoke)机制来完成。但是PInvoke 需要程序员提供函数声明,这点比较麻烦且有可能出错。PInvoke.NET将帮你避免错误,提高效率。