确定当前演示文稿显示模式

时间:2015-03-24 15:58:58

标签: c# winapi windows-8 multiple-monitors

取自SO question我有以下代码将我的演示模式切换为“扩展”:

var proc = new Process { StartInfo = { FileName = "DisplaySwitch.exe", Arguments = "/extend" } };
proc.Start();

但是如果演示文稿显示模式尚未设置为扩展,我只想运行该代码段。无论如何以编程方式确定机器的当前演示文稿显示模式

注意:该解决方案只需要适用于Windows 8计算机。

1 个答案:

答案 0 :(得分:1)

我不知道你是否仍然对解决方案感兴趣。 你必须使用CCD(连接和配置显示器),你只能通过使用dllimport调用windows函数来实现。 以下是CCD https://msdn.microsoft.com/en-us/library/windows/hardware/ff539367(v=vs.85).aspx

的链接

为此,您必须拨2个电话。首先,您必须获取缓冲区大小,然后显示配置。

[DllImport("User32.dll")]
    public static extern StatusCode GetDisplayConfigBufferSizes(
        QueryDisplayConfigFlags flags, 
        out int numPathArrayElements,
        out int numModeInfoArrayElements);

[Flags]
public enum QueryDisplayConfigFlags : uint
{
    QDC_ZERO = 0x0,
    QDC_ALL_PATHS = 0x00000001,
    QDC_ONLY_ACTIVE_PATHS = 0x00000002,
    QDC_DATABASE_CURRENT = 0x00000004
}

public enum StatusCode : uint
{
    Success = 0,
    InvalidParameter = 87,
    NotSupported = 50,
    AccessDenied = 5,
    GenFailure = 31,
    BadConfiguration = 1610,
    InSufficientBuffer = 122,
}

int numPathArrayElements;
int numModeInfoArrayElements;

var status = CCDWrapper.GetDisplayConfigBufferSizes(
             pathType,
             out numPathArrayElements,
             out numModeInfoArrayElements);

[DllImport("User32.dll")]
    public static extern StatusCode QueryDisplayConfig(
        QueryDisplayConfigFlags flags,
        ref int numPathArrayElements,
        [Out] DISPLAYCONFIG_PATH_INFO[] pathInfoArray,
        ref int modeInfoArrayElements,
        [Out] DisplayConfigModeInfo[] modeInfoArray,
        out DISPLAYCONFIG_TOPOLOGY_ID_Flags topologyId
    );

[Flags]
public enum DISPLAYCONFIG_TOPOLOGY_ID_Flags: uint
{
    DISPLAYCONFIG_TOPOLOGY_ZERO = 0x0,
    DISPLAYCONFIG_TOPOLOGY_INTERNAL = 0x00000001,
    DISPLAYCONFIG_TOPOLOGY_CLONE = 0x00000002,
    DISPLAYCONFIG_TOPOLOGY_EXTEND = 0x00000004,
    DISPLAYCONFIG_TOPOLOGY_EXTERNAL = 0x00000008,
    DISPLAYCONFIG_TOPOLOGY_FORCE_UINT32 = 0xFFFFFFFF
}

呼叫中还需要DISPLAYCONFIG_PATH_INFO和DisplayConfigModeInfo。它们不能为空。但是这两种结构包括其他几种类型,这些类型太多而无法粘贴在这里。

如果您按照以下链接在github上找到示例项目。 droid-autorotate@Github

从那里你可以复制缺失的结构。