我想写一些有趣的代码在
Windows 7上翻转方向.请参阅我想要控制的选项的屏幕截图.
这是我的代码:
class Program { public const long WM_PAINT=0x0F; public const long WM_disPLAYCHANGE=0x7E; [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)] public struct DEVMODE // taken from Win API { ... public System.Windows.Forms.Screenorientation dmdisplayOrientation; } [DllImport("user32.dll",CharSet=CharSet.Auto)] public static extern bool EnumdisplaySettings(string lpszDeviceName,int iModeNum,ref DEVMODE lpDevMode); [DllImport("user32.dll",CharSet=CharSet.Ansi)] public static extern int ChangedisplaySettings(ref DEVMODE lpDevMode,int dwFlags); [DllImport("User32.Dll")] public static extern long PostMessage(IntPtr hWnd,long wMsg,long wParam,long lParam); static void Main(string[] args) { Screenorientation ori=Screenorientation.Angle0; DEVMODE mode=new DEVMODE() { dmSize=(short)Marshal.SizeOf(typeof(DEVMODE)),dmDriverExtra=0,dmDeviceName=new string(new char[32]),dmFormName=new string(new char[32]),}; try { EnumdisplaySettings(null,-1,ref mode); if((mode.dmFields&0x80)>0) { ori=mode.dmdisplayOrientation; } mode.dmdisplayOrientation=Screenorientation.Angle270; int temp=mode.dmPelsWidth; mode.dmPelsWidth=mode.dmPelsHeight; mode.dmPelsHeight=temp; int ret=ChangedisplaySettings(ref mode,0); PostMessage(Process.GetCurrentProcess().Handle,WM_disPLAYCHANGE,0); ... } catch { } } }
哪个运行,但不会产生任何影响.
参考代码:http://justlikeamagic.com/2009/05/21/changing-display-settings-programmatically/
和http://msdn.microsoft.com/en-us/library/ms812499.aspx#tbconchgscrn_chngingdisplay
解决方法
我已经开始了.
它包含Win7的必要结构,因此您可以调用SetdisplayConfig和其他函数.
int numPathArrayElements; int numModeInfoArrayElements; const QuerydisplayFlags pathType = QuerydisplayFlags.OnlyActivePaths; // query active paths from the current computer. // note that 0 is equal to SUCCESS! // Todo; HARDCODE MAGIC VALUES AWAY. if (CCDWrapper.GetdisplayConfigBufferSizes(pathType,out numPathArrayElements,out numModeInfoArrayElements) == 0) { var pathInfoArray = new displayConfigPathInfo[numPathArrayElements]; var modeInfoArray = new displayConfigModeInfo[numModeInfoArrayElements]; // Todo; FALLBACK MECHANISM THAT HANDLES DIFFERENT VALUES FOR ZERO. if (CCDWrapper.QuerydisplayConfig( pathType,ref numPathArrayElements,pathInfoArray,ref numModeInfoArrayElements,modeInfoArray,IntPtr.Zero) == 0) { pathInfoArray[0].targetInfo.rotation = displayConfigRotation.Rotate90; CCDWrapper.SetdisplayConfig((uint) numPathArrayElements,(uint) numModeInfoArrayElements,SdcFlags.Apply | SdcFlags.UseSupplieddisplayConfig); } }
它现在是原始的,这意味着现在没有“C#style”API,但是,你可以使用这些结构.