2013-04-18 26 views
5

Nel link sottostante, Microsoft descrive due modi per limitare la rotazione di una schermata dell'applicazione su un tablet.Come impedire allo schermo di ruotare automaticamente su un tablet?

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

quello che sta succedendo è che Delphi di (XE3) TRibbon non gestisce bene rotazione. tende ad essere appeso.

come ci si aspetterebbe, il sito Web MS descrive come eseguire questa operazione dai prodotti di sviluppo MS. Non vedo come posso farlo nel mio progetto Delphi.

Metodo 1:

aggiungere questo al file appxmanifest:

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

non ho ancora trovato dove/come l'appxmanifest dovrebbe essere parte dell'applicazione in modo da poter fare questo in Delphi.

Metodo 2:

chiamano questo con il codice:

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

Per migrare questa a Delfi, avrei bisogno di sapere API informazioni DLL così ho potuto fare qualcosa di simile.

Qualche idea?

Potrebbe esserci un oggetto COM o una DLL che ci consente di accedere a questo?

+0

Anche se molto dubbioso, sto ancora aspettando il giorno in cui Delphi viene riconosciuto abbastanza da consentire a Microsoft di fornire esempi di codice come le loro altre lingue primarie. –

+0

Puoi per favore chiarire se vuoi che questo si applichi specificamente a Windows 8 o no? AFAIK, è applicabile a Windows 7+, ma presumo che possa provenire da XP + –

+0

Mi aspettavo solo che funzionasse con win8. Grazie! jim mckeeth ha dato una soluzione qui sotto. –

risposta

6

Queste chiamate disabilitano la rotazione per un'applicazione WindowsRT (FKA Metro) che non è possibile creare con Delphi (ancora). Anche un'app Metropolis è ancora un'app desktop. C'è un solution on the Intel site.

Sulla base del feedback da X-Ray ho ripulito il codice:

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. 

Si vuole essere sicuri di chiamare solo questo su Windows 8 in quanto tale procedura non esiste altrove.

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

Un'altra opzione è BAD disabilitarlo per l'intera compressa. Basta andare su HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AutoRotation nel registro e cambiare Enable a .

+0

GRAZIE, Jim! Ho dovuto aggiungere stdcall e poi ha funzionato. Anche fatto un paio di altri miglioramenti minori. Dopo averlo testato a fondo e considerato che non è possibile testarlo, ho ritenuto che fosse giusto modificare il tuo commento per includere questo cambiamento. Grazie per quello che fai per la comunità Delphi! –

+0

@ X-Ray: sentiti libero di modificare il mio codice. Sì, ho distanziato completamente StdCall. –

+0

Jim: le mie modifiche non sono visibili.StackOverflow ha detto che i cambiamenti dovrebbero essere "peer reviewed" e fino ad allora solo io ho potuto vedere le modifiche. ora anche io non vedo le mie modifiche quindi sembrerebbe che non sia mai successo. Grazie! mp –