二合一平板电脑会根据方向调整而旋转,下面是介绍如何 设置应用不跟随旋转,设置系统旋转开关,监听旋转变化
-
设置单个应用旋转固定方向SetDisplayAutoRotationPreferences
setDisplayAutoRotationPreferences 函数 (winuser.h) - Win32 apps
// 定义方向偏好枚举,用于控制屏幕显示方向[Flags]public enum ORIENTATION_PREFERENCE : int{/// <summary>/// 无方向偏好,允许所有方向/// </summary>ORIENTATION_PREFERENCE_NONE = 0x0,/// <summary>/// 横屏方向(正常横向)/// 屏幕宽度大于高度,标准的横向显示/// </summary>ORIENTATION_PREFERENCE_LANDSCAPE = 0x1,/// <summary>/// 竖屏方向(正常纵向)/// 屏幕高度大于宽度,标准的纵向显示/// </summary>ORIENTATION_PREFERENCE_PORTRAIT = 0x2,/// <summary>/// 翻转横屏方向/// 屏幕宽度大于高度,但上下翻转的横向显示/// </summary>ORIENTATION_PREFERENCE_LANDSCAPE_FLIPPED = 0x4,/// <summary>/// 翻转竖屏方向/// 屏幕高度大于宽度,但左右翻转的纵向显示/// </summary>ORIENTATION_PREFERENCE_PORTRAIT_FLIPPED = 0x8}// 声明外部方法[DllImport("user32.dll")]private static extern bool SetDisplayAutoRotationPreferences(ORIENTATION_PREFERENCE orientation);// 供应用程序调用的方法public static bool LockLandscape(){// 同时锁定正常var preference = ORIENTATION_PREFERENCE.ORIENTATION_PREFERENCE_LANDSCAPE;return SetDisplayAutoRotationPreferences(preference);}
-
设置系统旋转开关SetDisplayAutoRotation
SetDisplayAutoRotation这个方法没找到官方API,这个方式设置立即生效的,如果是注册表设置需要重启才生效
// 禁用启用自动旋转[DllImport("user32.dll", EntryPoint = "#2507")]public static extern bool SetDisplayAutoRotation(bool enable);
-
监听设备旋转变化
使用Win10 Api的SimpleOrientationSensor SimpleOrientationSensor 类 (Windows.Devices.Sensors) - Windows UWP applications
internal class OrientationManager
{#region 监听方向变化private SimpleOrientationSensor simpleSensor;private SimpleOrientation currentOrientation;/// <summary>/// 监听方向变化重启应用/// </summary>public void RegisterOrientationChanged(){try{if (simpleSensor != null){simpleSensor.OrientationChanged -= SimpleSensor_OrientationChanged;}simpleSensor = SimpleOrientationSensor.GetDefault();AnnotatorService.Log.Info($"初始化方向传感器:{simpleSensor != null}");if (simpleSensor != null){currentOrientation = simpleSensor.GetCurrentOrientation();// 订阅方向变化事件simpleSensor.OrientationChanged += SimpleSensor_OrientationChanged;}}catch (Exception e){AnnotatorService.Log.Error(e);}}public void UnregisterOrientationChanged(){if (simpleSensor != null){simpleSensor.OrientationChanged -= SimpleSensor_OrientationChanged;simpleSensor = null;}}public Action<SimpleOrientation> OnDelayOrientationChanged;private async void SimpleSensor_OrientationChanged(SimpleOrientationSensor sender, SimpleOrientationSensorOrientationChangedEventArgs args){AnnotatorService.Log.Info($"方向变化:{args.Orientation}");if (currentOrientation == args.Orientation) return;currentOrientation = args.Orientation;if (IsSignificantOrientationChange(currentOrientation)){await Task.Delay(300);OnDelayOrientationChanged?.Invoke(args.Orientation);}}private bool IsSignificantOrientationChange(SimpleOrientation newOrientation){// 过滤掉不重要的方向变化// 例如:Faceup/Facedown 可能不需要处理switch (newOrientation){case SimpleOrientation.Faceup:case SimpleOrientation.Facedown:return false;default:return true;}}#endregion}