如何防止屏幕在平板电脑上自动旋转?

时间:2013-04-18 21:35:13

标签: delphi ribbon tablet screen-rotation

在下面的链接中,Microsoft介绍了两种限制平板电脑上应用程序屏幕旋转的方法。

http://msdn.microsoft.com/en-ca/library/windows/apps/hh700342.aspx

正在发生的事情是德尔福的(XE3)TRibbon不能很好地处理旋转。它往往会被挂起。

正如预期的那样,MS网站描述了如何从MS开发产品中做到这一点。我不知道如何在我的Delphi项目中做到这一点。

方法1:

将此添加到您的appxmanifest文件中:

<InitialRotationPreference>
    <Rotation Preference="landscape"/>
    <Rotation Preference="landscapeFlipped"/>
</InitialRotationPreference>

我还没有找到appxmanifest应该成为应用程序的一部分,所以我可以在delphi中这样做。

方法2:

使用代码调用此方法:

 Windows.Graphics.Display.DisplayProperties.AutoRotationPreferences =
            Windows.Graphics.Display.DisplayOrientations.Landscape;

要将其迁移到delphi,我需要知道API DLL信息,以便我可以做类似的事情。

有什么想法吗?

是否有一个COM对象或DLL可以让我们访问它?

1 个答案:

答案 0 :(得分:6)

这些调用是禁用WindowsRT应用程序(FKA Metro)的旋转,你无法使用Delphi构建它。即使是Metropolis应用程序仍然是桌面应用程序。有solution on the Intel site

根据X-Ray的反馈,我清理了代码:

unit MetroDisplayRotation;

(* 
 *  Usage: TMetroDisplayRotation.SetDisplayAutoRotationPreferences(
 *           TMetroDisplayRotation.ORIENTATION_PREFERENCE_LANDSCAPE or 
 *           TMetroDisplayRotation.ORIENTATION_PREFERENCE_LANDSCAPE_FLIPPED);
 *)

interface

type
  TMetroDisplayRotation = class
  public const
    ORIENTATION_PREFERENCE_NONE = $0;
    ORIENTATION_PREFERENCE_LANDSCAPE = $1;
    ORIENTATION_PREFERENCE_PORTRAIT = $2;
    ORIENTATION_PREFERENCE_LANDSCAPE_FLIPPED = $4;
    ORIENTATION_PREFERENCE_PORTRAIT_FLIPPED = $8;

    class procedure SetDisplayAutoRotationPreferences(ORIENTATION_PREFERENCE: Integer);
  end;

implementation

uses
  SysUtils, Windows;

{ TMetroDisplayRotation }

class procedure TMetroDisplayRotation.SetDisplayAutoRotationPreferences(
  ORIENTATION_PREFERENCE: Integer);
type
  TSDARP = procedure(ORIENTATION_PREFERENCE: Integer); stdcall;
var
  UserHandle: THandle;
  SDARP: TSDARP;
begin
  UserHandle := GetModuleHandle('User32.dll');
  @SDARP := GetProcAddress(UserHandle, 'SetDisplayAutoRotationPreferences');
  if Assigned(SDARP) then
    SDARP(ORIENTATION_PREFERENCE);
end;

end.

您需要确保只在Windows 8上调用此方法,因为该程序在其他地方不存在。

用法:TMetroDisplayRotation.SetDisplayAutoRotationPreferences(TMetroDisplayRotation.ORIENTATION_PREFERENCE_LANDSCAPE or TMetroDisplayRotation.ORIENTATION_PREFERENCE_LANDSCAPE_FLIPPED);

另一个BAD选项是为整个平板电脑禁用它。只需转到注册表中的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AutoRotation,然后将Enable更改为 0