Detecting Secondary Screen Orientation Visual Basic

做~自己de王妃 提交于 2019-12-24 20:46:43

问题


I can get primary screen orientation using this logic:

MessageBox.Show(SystemInformation.ScreenOrientation())

How can I handle this if I have multiple screens?I only manage to get primary screen orientation information. How can I get additional / other screens orientation ?


回答1:


According to Documentation, you can get all screens using System.Windows.Forms.Screen.AllScreens.

Just iterate over them like so and check the resolution, like so:

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.");
    }
}

Edit:

I've search a bit on the wide web as I was curious myself and there does not seem to be an easy way to get it. I stumbled across this answer and modified it slightly..

Note that it is quite complex for what it does.. but it will allow you to query for a lot of other items.

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();
}

After I ran the code that I've slightly modified (I have two monitors connected all without rotation) it resulted in:

DELL U2412M - 1
DELL U2412M - 1

Which is as expected.

I've left the code outside the for loop untouched because I believe there are a lot of interesting objects you can take a look at.



来源:https://stackoverflow.com/questions/52218727/detecting-secondary-screen-orientation-visual-basic

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!