检测辅助屏幕方向Visual Basic

时间:2018-09-07 08:43:54

标签: screen-orientation

我可以使用以下逻辑获取主屏幕方向:

MessageBox.Show(SystemInformation.ScreenOrientation())

如果有多个屏幕,我该如何处理?我只能设法获取主要屏幕方向信息。如何获得其他/其他屏幕方向?

1 个答案:

答案 0 :(得分:0)

根据Documentation,您可以使用System.Windows.Forms.Screen.AllScreens来获取所有屏幕。

就像这样遍历它们并检查分辨率,就像这样:

foreach (var screen in System.Windows.Forms.Screen.AllScreens)
{

    if( screen.Bounds.Height > screen.Bounds.Width )
    {
        //Run the application in portrait, as in:
        MessageBox.Show("Run in portrait.");
    }
    else
    {
        //Run the application in landscape, as in:
        MessageBox.Show("Run in landscape.");
    }
}

编辑:

由于好奇自己,我已经在宽泛的网络上进行了一些搜索,但似乎没有一种简单的方法来获得它。我偶然发现across this answer并对其进行了少许修改。.

请注意,它的功能相当复杂..但是它将允许您查询许多其他项目。

public const int ERROR_SUCCESS = 0;

public enum QUERY_DEVICE_CONFIG_FLAGS: uint
{
    QDC_ALL_PATHS          = 0x00000001,
    QDC_ONLY_ACTIVE_PATHS  = 0x00000002,
    QDC_DATABASE_CURRENT   = 0x00000004
}

public enum DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY: uint
{
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER                   = 0xFFFFFFFF,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HD15                    = 0,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SVIDEO                  = 1,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPOSITE_VIDEO         = 2,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_COMPONENT_VIDEO         = 3,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DVI                     = 4,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_HDMI                    = 5,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_LVDS                    = 6,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_D_JPN                   = 8,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDI                     = 9,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EXTERNAL    = 10,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_DISPLAYPORT_EMBEDDED    = 11,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EXTERNAL            = 12,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_UDI_EMBEDDED            = 13,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_SDTVDONGLE              = 14,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_MIRACAST                = 15,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_INTERNAL                = 0x80000000,
    DISPLAYCONFIG_OUTPUT_TECHNOLOGY_FORCE_UINT32            = 0xFFFFFFFF
}

public enum DISPLAYCONFIG_SCANLINE_ORDERING: uint
{
    DISPLAYCONFIG_SCANLINE_ORDERING_UNSPECIFIED                 = 0,
    DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE                 = 1,
    DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED                  = 2,
    DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_UPPERFIELDFIRST  = DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED,
    DISPLAYCONFIG_SCANLINE_ORDERING_INTERLACED_LOWERFIELDFIRST  = 3,
    DISPLAYCONFIG_SCANLINE_ORDERING_FORCE_UINT32                = 0xFFFFFFFF
}

public enum DISPLAYCONFIG_ROTATION: uint
{
    DISPLAYCONFIG_ROTATION_IDENTITY     = 1,
    DISPLAYCONFIG_ROTATION_ROTATE90     = 2,
    DISPLAYCONFIG_ROTATION_ROTATE180    = 3,
    DISPLAYCONFIG_ROTATION_ROTATE270    = 4,
    DISPLAYCONFIG_ROTATION_FORCE_UINT32 = 0xFFFFFFFF
}

public enum DISPLAYCONFIG_SCALING: uint
{
    DISPLAYCONFIG_SCALING_IDENTITY                  = 1,
    DISPLAYCONFIG_SCALING_CENTERED                  = 2,
    DISPLAYCONFIG_SCALING_STRETCHED                 = 3,
    DISPLAYCONFIG_SCALING_ASPECTRATIOCENTEREDMAX    = 4,
    DISPLAYCONFIG_SCALING_CUSTOM                    = 5,
    DISPLAYCONFIG_SCALING_PREFERRED                 = 128,
    DISPLAYCONFIG_SCALING_FORCE_UINT32              = 0xFFFFFFFF
}

public enum DISPLAYCONFIG_PIXELFORMAT : uint
{
    DISPLAYCONFIG_PIXELFORMAT_8BPP          = 1,
    DISPLAYCONFIG_PIXELFORMAT_16BPP         = 2,
    DISPLAYCONFIG_PIXELFORMAT_24BPP         = 3,
    DISPLAYCONFIG_PIXELFORMAT_32BPP         = 4,
    DISPLAYCONFIG_PIXELFORMAT_NONGDI        = 5,
    DISPLAYCONFIG_PIXELFORMAT_FORCE_UINT32  = 0xffffffff
}

public enum DISPLAYCONFIG_MODE_INFO_TYPE : uint
{
    DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE = 1,
    DISPLAYCONFIG_MODE_INFO_TYPE_TARGET = 2,
    DISPLAYCONFIG_MODE_INFO_TYPE_FORCE_UINT32 = 0xFFFFFFFF
}

public enum DISPLAYCONFIG_DEVICE_INFO_TYPE : uint
{
      DISPLAYCONFIG_DEVICE_INFO_GET_SOURCE_NAME             = 1,
      DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME             = 2,
      DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_PREFERRED_MODE   = 3,
      DISPLAYCONFIG_DEVICE_INFO_GET_ADAPTER_NAME            = 4,
      DISPLAYCONFIG_DEVICE_INFO_SET_TARGET_PERSISTENCE      = 5,
      DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_BASE_TYPE        = 6,
      DISPLAYCONFIG_DEVICE_INFO_FORCE_UINT32                = 0xFFFFFFFF
}

[StructLayout(LayoutKind.Sequential)]
public struct LUID
{
    public uint LowPart;
    public int HighPart;
}

[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_SOURCE_INFO
{
  public LUID adapterId;
  public uint id;
  public uint modeInfoIdx;
  public uint statusFlags;
}

[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_TARGET_INFO
{
    public LUID adapterId;
    public uint id;
    public uint modeInfoIdx;
    DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY   outputTechnology;
    public DISPLAYCONFIG_ROTATION                  rotation;
    DISPLAYCONFIG_SCALING                   scaling;
    DISPLAYCONFIG_RATIONAL                  refreshRate;
    DISPLAYCONFIG_SCANLINE_ORDERING         scanLineOrdering;
    public bool targetAvailable;
    public uint statusFlags;
}

[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_RATIONAL
{
    public uint Numerator;
    public uint Denominator;
}

[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_PATH_INFO
{
    public DISPLAYCONFIG_PATH_SOURCE_INFO sourceInfo;
    public DISPLAYCONFIG_PATH_TARGET_INFO targetInfo;
    public uint flags;
}

[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_2DREGION
{
    public uint cx;
    public uint cy;
}

[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_VIDEO_SIGNAL_INFO
{
    public ulong pixelRate;
    public DISPLAYCONFIG_RATIONAL hSyncFreq;
    public DISPLAYCONFIG_RATIONAL vSyncFreq;
    public DISPLAYCONFIG_2DREGION activeSize;
    public DISPLAYCONFIG_2DREGION totalSize;
    public uint videoStandard;
    public DISPLAYCONFIG_SCANLINE_ORDERING scanLineOrdering;
}

[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_TARGET_MODE
{
    public DISPLAYCONFIG_VIDEO_SIGNAL_INFO targetVideoSignalInfo;
}

[StructLayout(LayoutKind.Sequential)]
public struct POINTL
{
    int x;
    int y;
}

[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_SOURCE_MODE
{
    public uint width;
    public uint height;
    public DISPLAYCONFIG_PIXELFORMAT pixelFormat;
    public POINTL position;
}

[StructLayout(LayoutKind.Explicit)]
public struct DISPLAYCONFIG_MODE_INFO_UNION
{
    [FieldOffset(0)]
    public DISPLAYCONFIG_TARGET_MODE targetMode;
    [FieldOffset(0)]
    public DISPLAYCONFIG_SOURCE_MODE sourceMode;
}

[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_MODE_INFO
{
    public DISPLAYCONFIG_MODE_INFO_TYPE infoType;
    public uint id;
    public LUID adapterId;
    public DISPLAYCONFIG_MODE_INFO_UNION modeInfo;
}

[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS
{
    public uint value;
}

[StructLayout(LayoutKind.Sequential)]
public struct DISPLAYCONFIG_DEVICE_INFO_HEADER
{
    public DISPLAYCONFIG_DEVICE_INFO_TYPE type;
    public uint size;
    public LUID adapterId;
    public uint id;
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DISPLAYCONFIG_TARGET_DEVICE_NAME
{
    public DISPLAYCONFIG_DEVICE_INFO_HEADER header;
    public DISPLAYCONFIG_TARGET_DEVICE_NAME_FLAGS flags;
    public DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY outputTechnology;
    public ushort edidManufactureId;
    public ushort edidProductCodeId;
    public uint connectorInstance;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
    public string monitorFriendlyDeviceName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
    public string monitorDevicePath;
}

[DllImport("user32.dll")]
public static extern int GetDisplayConfigBufferSizes(
    QUERY_DEVICE_CONFIG_FLAGS Flags, 
    out uint NumPathArrayElements, 
    out uint NumModeInfoArrayElements
);

[DllImport("user32.dll")]
public static extern int QueryDisplayConfig(
    QUERY_DEVICE_CONFIG_FLAGS Flags, 
    ref uint NumPathArrayElements, 
    [Out] DISPLAYCONFIG_PATH_INFO[] PathInfoArray,
    ref uint NumModeInfoArrayElements,
    [Out] DISPLAYCONFIG_MODE_INFO[] ModeInfoArray,
    IntPtr CurrentTopologyId
);

[DllImport("user32.dll")]
public static extern int DisplayConfigGetDeviceInfo(
    ref DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName
);

[DllImport("user32.dll")]
public static extern object GetMonitorRotation(
    ref DISPLAYCONFIG_PATH_INFO deviceStuff
    );

public static string MonitorFriendlyName(LUID adapterId, uint targetId)
{
    DISPLAYCONFIG_TARGET_DEVICE_NAME deviceName = new DISPLAYCONFIG_TARGET_DEVICE_NAME();
    deviceName.header.size = (uint)Marshal.SizeOf(typeof(DISPLAYCONFIG_TARGET_DEVICE_NAME));
    deviceName.header.adapterId = adapterId;
    deviceName.header.id = targetId;
    deviceName.header.type = DISPLAYCONFIG_DEVICE_INFO_TYPE.DISPLAYCONFIG_DEVICE_INFO_GET_TARGET_NAME;
    int error = DisplayConfigGetDeviceInfo(ref deviceName);
    if (error != ERROR_SUCCESS)
        throw new Win32Exception(error);
    return deviceName.monitorFriendlyDeviceName;
}




public static void Run()
{
    uint PathCount, ModeCount;
    int error = GetDisplayConfigBufferSizes(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,
        out PathCount, out ModeCount);
    if (error != ERROR_SUCCESS)
        throw new Win32Exception(error);

    DISPLAYCONFIG_PATH_INFO[] DisplayPaths = new DISPLAYCONFIG_PATH_INFO[PathCount];
    DISPLAYCONFIG_MODE_INFO[] DisplayModes = new DISPLAYCONFIG_MODE_INFO[ModeCount];
    error = QueryDisplayConfig(QUERY_DEVICE_CONFIG_FLAGS.QDC_ONLY_ACTIVE_PATHS,
        ref PathCount, DisplayPaths, ref ModeCount, DisplayModes, IntPtr.Zero);
    if (error != ERROR_SUCCESS)
        throw new Win32Exception(error);

    for (int i = 0; i < PathCount; i++) 
    {

        Console.WriteLine(string.Format("{0} - {1}", MonitorFriendlyName(DisplayPaths[i].targetInfo.adapterId, DisplayPaths[i].targetInfo.id), (int)DisplayPaths[i].targetInfo.rotation));

    }

    Console.ReadLine();
}

运行我稍作修改的代码后(我连接了两个显示器,没有旋转),结果是:

DELL U2412M - 1
DELL U2412M - 1

符合预期。

我保留了for循环外的代码,因为我相信您可以查看很多有趣的对象。