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

Delphi 如何防止屏幕在平板电脑上自动旋转?,delphi,ribbon,tablet,screen-rotation,Delphi,Ribbon,Tablet,Screen Rotation,在下面的链接中,Microsoft介绍了两种限制平板电脑上应用程序屏幕旋转的方法 发生的事情是delphi的(XE3)TRibbon不能很好地处理旋转。它容易上吊 正如预期的那样,MS网站描述了如何从MS开发产品中实现这一点。我不知道如何在我的Delphi项目中做到这一点 方法1: 将此添加到appxmanifest文件: <InitialRotationPreference> <Rotation Preference="landscape"/> <

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

发生的事情是delphi的(XE3)TRibbon不能很好地处理旋转。它容易上吊

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

方法1:

将此添加到appxmanifest文件:

<InitialRotationPreference>
    <Rotation Preference="landscape"/>
    <Rotation Preference="landscapeFlipped"/>
</InitialRotationPreference>
要将其迁移到delphi,我需要知道API DLL信息,以便可以执行类似的操作

有什么想法吗


有没有COM对象或DLL可以让我们访问它?

这些调用是为了禁用WindowsRT应用程序(FKA Metro)的旋转,而您目前还无法使用Delphi构建该应用程序。即使是Metropolis应用程序也是桌面应用程序。有一个问题

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

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\u PREFERENCE\u横向或TMetroDisplayRotation.ORIENTATION\u PREFERENCE\u横向翻转)


另一个不好的选择是在整个平板电脑上禁用它。只需进入注册表中的
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AutoRotation
,并将
Enable
更改为0

,尽管非常可疑,我仍在等待有一天,Delphi被微软认可,能够像其他主要语言一样提供代码示例。您能否澄清一下,您是否希望它特别适用于Windows 8?好吧,它适用于Windows7+,但我假设它可能来自XP+,我只希望它能与win8一起工作。谢谢jim mckeeth给出了以下解决方案。谢谢你,jim!必须添加stdcall,然后它就工作了。还做了一些其他的小改进。经过彻底测试,并且考虑到您无法测试它,我觉得编辑您的评论以包含此更改是正确的。感谢您为Delphi社区所做的一切@X射线:请随意编辑我的代码。是的,我把StdCall隔开了。吉姆:我的变化不可见。stackoverflow表示,这些变化需要“同行评审”,在此之前,只有我能看到这些变化。现在,即使是我也看不到我的变化,所以这似乎从未发生过。谢谢mp@X-雷:谢谢,我把它清理干净,并把它作为一个可重复使用的单元发布。
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.