在两个屏幕中切换横向和纵向模式

时间:2014-11-14 04:39:05

标签: c# windows

我可以使用以下代码(我今天早上完成)在一个屏幕中切换Landsacpe和Portrait模式。问题是我在电脑上有两个屏幕。我希望屏幕1是LANDSCAPE模式,屏幕2是PORTRAIT模式。但我不知道如何修改代码使其工作。 (抱歉我的英文)

class ModeSetting
{
    public const int LANDSCAPE = 0;
    public const int PORTRAIT = 1;

    public static bool ChangeMode(int screenID, int modeID)
    {
        //I'm not using screenID here. Let me know how to do that. How to get screenID
        //Or anything that help me.
        DEVMODE dm = new DEVMODE();
        dm.dmDeviceName = new string(new char[32]);
        dm.dmFormName = new string(new char[32]);
        //dm.dmSize = Marshal.SizeOf(dm);
        if (modeID != PORTRAIT) modeID = LANDSCAPE;

        if (0 != NativeMethods.EnumDisplaySettings(
        null,
        NativeMethods.ENUM_CURRENT_SETTINGS,
        ref dm))
        {
            int temp = dm.dmPelsHeight;
            dm.dmPelsHeight = dm.dmPelsWidth;
            dm.dmPelsWidth = temp;
            dm.dmDisplayOrientation = modeID;

            int iRet = NativeMethods.ChangeDisplaySettings(ref dm, 0);
            Console.WriteLine(iRet);

            if (NativeMethods.DISP_CHANGE_SUCCESSFUL != iRet)
            {
                return false;
            }
            return true;
        }

        return false;
    }

    [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;
    }

    internal 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);

        // 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;
        public const int DISP_CHANGE_SUCCESSFUL = 0;
    }
}

我可以使用:

在LANDSCAPE和PORTRAIT模式之间切换
ModeSetting.ChangeMode(0, ModeSetting.LANDSCAPE);//0 here is screen ID that I cannot do when two screens
ModeSetting.ChangeMode(0, ModeSetting.PORTRAIT);

0 个答案:

没有答案