Как предотвратить автоматическое вращение экрана на планшете?
В приведенной ниже ссылке 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.