冰雪

以编程方式更改屏幕方向(2)

2019-09-10 17:54:17来源:励志吧0次阅读

在托管代码中获取并更改显示设置

映射 API

为了在托管代码中更改显示设置,必须使用平台调用服务 (PInvoke) 调用 EnumDisplaySettings 和 ChangeDisplaySettings API。对此,一个好的做法是创建一个名为 NativeMethods 的类,该类可以将封装这些 API 的公共静态方法公开。该类应该包含 API 所对应的所有必需的常量定义。以下代码示例演示了这种做法。该类的完整实现可在 NativeMethods.cs 文件中找到,该文件是示例应用程序的一部分。

using System.Runtime.InteropServices;

...

public class NativeMethods

{

// PInvoke declaration for EnumDisplaySettings Win32 API

[DllImport("user32.dll", CharSet=CharSet.Ansi)]

public static extern int EnumDisplaySettings(

string lpszDeviceName,

int iModeNum,

ref DEVMODE lpDevMode);

// PInvoke declaration for ChangeDisplaySettings Win32 API

[DllImport("user32.dll, CharSet=CharSet.Ansi")]

public static extern int ChangeDisplaySettings(

ref DEVMODE lpDevMode,

int dwFlags);

// add more functions as needed ??

// constants

public const int ENUM_CURRENT_SETTINGS = -1;

public const int DMDO_DEFAULT = 0;

public const int DMDO_90 = 1;

public const int DMDO_180 = 2;

public const int DMDO_270 = 3;

// add more constants as needed ??

}

映射 DEVMODE 结构

在将 DEVMODE 结构映射到托管结构时,应该注意以下几个问题:

◆因为 DEVMODE 结构包含联合 (union),所以必须挑选出我们所需要的那些成员。

◆在 .NET Framework 中映射到字符串的数组必须作为相同大小的字符串封送。

◆为简单起见,可以将嵌套结构平面化(例如,将 POINTL 结构替换为两个托管的 int 类型。)

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]

public struct DEVMODE

{

[MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)]

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 int dmDisplayOrientation;

public int dmDisplayFixedOutput;

public short dmColor;

public short dmDuplex;

public short dmYResolution;

public short dmTTOption;

public short dmCollate;

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]

public string dmFormName;

public short dmLogPixels;

public short 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;

};

在 .NET Framework 中初始化 DEVMODE 结构的新实例时,请确保 dmDeviceName、dmFormName 和 dmSize 值设置恰当。为此,我在示例应用程序的NativeMethods 类中添加了以下方法:

public static DEVMODE CreateDevmode()

{

DEVMODE dm = new DEVMODE();

dm.dmDeviceName = new String(new char[32]);

dm.dmFormName = new String(new char[32]);

dm.dmSize = (short)Marshal.SizeOf(dm);

return dm;

}

2岁宝宝流鼻血
小孩健脾胃的食谱
幼儿口舌生疮
小儿咽喉肿痛
分享到: