【问题标题】:How to prevent the screen from automatically rotating on a tablet?如何防止屏幕在平板电脑上自动旋转?
【发布时间】:2013-04-18 21:35:13
【问题描述】:

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

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

发生的事情是 delphi 的 (XE3) TRibbon 不能很好地处理旋转。它往往会挂起。

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

方法一:

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

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

我还没有找到 appxmanifest 应该在哪里/如何成为应用程序的一部分,因此我可以在 delphi 中执行此操作。

方法二:

用代码调用它:

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

要将其迁移到 delphi,我需要知道 API DLL 信息,这样我才能做类似的事情。

有什么想法吗?

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

【问题讨论】:

  • 虽然很怀疑,但我仍在等待 Delphi 得到足够认可的那一天,让微软像其他主要语言一样提供代码示例。
  • 您能否澄清一下您是否希望它专门适用于 Windows 8? AFAIK,它适用于 Windows 7+,但我假设它可能来自 XP+
  • 我只期望它可以与win8一起使用。谢谢! jim mckeeth 在下面给出了解决方案。

标签: delphi ribbon tablet screen-rotation


【解决方案1】:

这些调用是为了禁用 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);

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

【讨论】:

  • 谢谢你,吉姆!必须添加 stdcall 然后它工作。还做了一些其他的小改进。经过彻底测试并考虑到您无法对其进行测试,我认为编辑您的评论以包含此更改是正确的。感谢您为 Delphi 社区所做的一切!
  • @X-Ray:随意编辑我的代码。是的,我完全间隔了 StdCall。
  • 吉姆:我的更改不可见。 stackoverflow 说这些变化需要“同行评审”,直到那时只有我才能看到这些变化。现在,即使我没有看到我的更改,所以看起来从未发生过。谢谢! mp
  • @X-Ray:谢谢,我把它清理干净并发布为可重复使用的单元。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 2014-10-04
  • 2013-02-14
  • 1970-01-01
  • 2011-02-13
相关资源
最近更新 更多