科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件以编程方式更改屏幕方向(2)

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文描述如何以编程方式更改显示设备的方向、分辨率及其他方面。相应示例采用C

作者:Stefan Wick 来源:51CTO.com 2007年9月1日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

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

映射 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;

}

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章