2013-04-18 7 views
5

Im folgenden Link beschreibt Microsoft zwei Möglichkeiten, die Rotation eines Anwendungsbildschirms auf einem Tablet zu beschränken.Wie verhindert man, dass sich der Bildschirm automatisch auf einem Tablet dreht?

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

, was passiert, ist, dass Delphis (XE3) TRibbon nicht Rotation gut im Griff hat. es neigt dazu, aufgehängt zu werden.

wie erwartet, beschreibt die MS-Website, wie dies von MS-Entwicklungsprodukten zu tun ist. Ich sehe nicht, wie ich das in meinem Delphi-Projekt machen kann.

Methode 1:

diese zu Ihrem appxmanifest Datei hinzufügen:

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

habe ich noch nicht gefunden, wo/wie der appxmanifest Teil der Anwendung sein sollte, so kann ich dies tun in Delphi.

Methode 2:

nennen dies mit Code:

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

dies zu wandern delphi, würde ich brauche ich API DLL Informationen zu wissen, so etwas Ähnliches tun könnte.

Irgendwelche Ideen?

Könnte es ein COM-Objekt oder eine DLL geben, die uns Zugriff darauf bietet?

+0

Obwohl ich sehr zweifelhaft bin, warte ich immer noch auf den Tag, an dem Delphi genug erkannt wird, dass Microsoft Codebeispiele wie ihre anderen Hauptsprachen bereitstellen kann. –

+0

Können Sie bitte klären, ob dies speziell für Windows 8 gilt oder nicht? AFAIK, Es ist anwendbar auf Windows 7+, aber ich gehe davon aus, dass es von XP + –

+0

sein könnte Ich hatte nur erwartet, dass es mit win8 funktioniert. Vielen Dank! Jim Mckeeth hat unten eine Lösung gegeben. –

Antwort

6

Diese Aufrufe sind zum Deaktivieren der Rotation für eine WindowsRT-Anwendung (FKA Metro), die Sie (noch) nicht mit Delphi erstellen können. Auch eine Metropolis-App ist immer noch eine Desktop-App. Es gibt eine solution on the Intel site.

Basierend auf dem Feedback von X-Ray reinigte ich den Code oben:

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. 

Sie wollen diese auf Windows 8, um sicherzustellen, Sie nur aufrufen, da dieses Verfahren nicht an anderer Stelle nicht existiert.

Verbrauch: TMetroDisplayRotation.SetDisplayAutoRotationPreferences(TMetroDisplayRotation.ORIENTATION_PREFERENCE_LANDSCAPE or TMetroDisplayRotation.ORIENTATION_PREFERENCE_LANDSCAPE_FLIPPED);

Eine weitere schlechte Option ist es für die gesamte Tablette zu deaktivieren. Gehen Sie einfach zu HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AutoRotation in der Registrierung und ändern Sie Enable zu .

+0

DANKE, Jim! Musste stdcall hinzufügen und dann funktionierte es. Außerdem wurden noch ein paar kleinere Verbesserungen vorgenommen. Ich habe es gründlich getestet und in Betracht gezogen, dass du es nicht testen kannst. Ich hielt es für richtig, deinen Kommentar so zu bearbeiten, dass er diese Änderung enthält. Vielen Dank für das, was Sie für die Delphi-Community tun! –

+0

@ X-Ray: Fühlen Sie sich frei, meinen Code zu bearbeiten. Ja, ich habe StdCall total auf Abstand gehalten. –

+0

Jim: meine Änderungen sind nicht sichtbar.stackoverflow sagte, die Änderungen müssten "peer reviewed" sein und bis dahin konnte ich nur die Änderungen sehen. Jetzt sehe ich auch meine Änderungen nicht mehr, so dass es so aussieht, als wäre es nie passiert. Vielen Dank! mp –

Verwandte Themen