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