我需要编写一个程序,修改屏幕的显示位置。看到了下面的文章:
http://allancandy.cnblogs.com/articles/221958.html
想到了这样的方法:        public enum DMDO
        {
            DEFAULT = 0,
            D90 = 1,
            D180 = 2,
            D270 = 3
        }        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        struct DEVMODE
        {
            public const int DM_DISPLAYFREQUENCY = 0x400000;
            public const int DM_PELSWIDTH = 0x80000;
            public const int DM_PELSHEIGHT = 0x100000;
            public const int DM_POSITION = 0x000020;//从VC6头文件查到的,应该没错
            private const int CCHDEVICENAME = 32;
            private const int CCHFORMNAME = 32;            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHDEVICENAME)]
            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 DMDO dmDisplayOrientation;
            public int dmDisplayFixedOutput;            public short dmColor;
            public short dmDuplex;
            public short dmYResolution;
            public short dmTTOption;
            public short dmCollate;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCHFORMNAME)]
            public string dmFormName;
            public short dmLogPixels;
            public int 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;
        }        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern int ChangeDisplaySettings([In] ref DEVMODE lpDevMode, int dwFlags);        public void ChangeRes()
        {
            Form1 t = new Form1();
            long RetVal = 0;
            DEVMODE dm = new DEVMODE();            dm.dmPositionX = 100;//X坐标
            dm.dmPositionY = 200;//Y坐标
            dm.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));
            dm.dmPelsWidth = Int32.Parse(width.Text);
            dm.dmPelsHeight = Int32.Parse(height.Text);            dm.dmFields = DEVMODE.DM_PELSWIDTH | DEVMODE.DM_PELSHEIGHT | DEVMODE.DM_POSITION;            RetVal = ChangeDisplaySettings(ref dm, 0);
        }可是发现能成功修改分辨率但不能修改屏幕的显示位置。
请问我的思路是否正确?如果总体思路正确请指出哪里出了问题
如果总体思路不正确,请指点明路

解决方案 »

  1.   

    to 可是发现能成功修改分辨率但不能修改屏幕的显示位置。分辨率是屏幕属性,那么可以通过API来修改,以上操作是没有错的。而修改屏幕的显示位置,
    如果是修改整个屏幕的显示位置,那是硬件操作,没有相关的sdk,是无法通过软件完成的;
    如果是某个程序的显示位置,获得hwnd,然后调用setwindowlong即可修改。
      

  2.   

    我需要修改整个屏幕的显示位置
    需要什么SDK才能完成?
      

  3.   

    to 需要什么SDK才能完成?好像很少有这方面的sdk,而且不同显示器的sdk也不同。因为在修改了分辨率后,都是通过显示器所提供菜单来手动修改屏幕位置、大小尺寸。
    所以你要在程序中去修改,得要看看显示器是否提供这方面的操作接口,否则无法实现。
      

  4.   

    GDI+ 或者 DirectX SDK 能不能做到?
      

  5.   

    1、软件上面这大概只有显卡/显示器驱动才能做到
    2、不管怎么实现,显示器有显示器的局限,不可能超出显示器的局限,去了解一下CRT显示器的原理,显示器上面调整的是偏转线圈,如过显示器调得太离谱,无论什么软件都无法纠正,只能调显示器
    3、你要考虑液晶显示器的情况。
    4、强行调整用户的分辨率是不友好的行为。