Как предотвратить автоматическое вращение экрана на планшете?

В приведенной ниже ссылке Microsoft описывает два способа ограничения поворота экрана приложения на планшете.

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

происходит то, что TRibbon от Delphi (XE3) плохо справляется с вращением. это имеет тенденцию быть повешенным.

Как и следовало ожидать, веб-сайт 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 ответ

Решение

Эти вызовы должны отключить ротацию для приложения WindowsRT (FKA Metro), которое вы не можете создать с помощью Delphi (пока). Даже приложение Metropolis по-прежнему является настольным приложением. На сайте Intel есть решение.

На основе отзывов от 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.

Другие вопросы по тегам