Activation des contrats Windows 8 dans votre application

Conception de Windows 8

Vision en coulisses de l'équipe d'ingénierie Windows

Activation des contrats Windows 8 dans votre application

  • Comments 1

Nous avons déjà présenté la façon dont les applications pouvaient, sur un PC Windows 8, communiquer avec d'autres applications et services Web. L'approche que nous avons adoptée dès le début de Windows 8 permet aux applications d'être la source ou la destination des données que vous voulez partager (un peu comme un presse-papiers, mais avec un modèle d'interaction plus riche et une sémantique plus claire). Lorsqu'une application implémente un contrat, Windows 8 peut servir de lien entre cette application et d'autres applications sur le système, et le système lui-même. Vous pouvez assister à ce phénomène lorsque vous réalisez une action simple, par exemple lorsque vous utilisez l'icône Partager sur une page Web dans la version de style Metro d'Internet Explorer. Vous pouvez partager le lien via l'application Courrier avec une personne dont vous avez stocké les coordonnées dans l'application Contacts, et ainsi de suite. Vous pouvez effectuer des recherches dans les applications qui implémentent le contrat de recherche. Vous pouvez ouvrir et enregistrer des fichiers depuis ou vers n'importe quel emplacement qui implémente les contrats du sélecteur de fichiers et du sélecteur d'ouverture de fichier. Cette approche innovante permet à Windows 8 de fonctionner avec n'importe quelle paire application/service au lieu de « coder en dur » un seul niveau de prise en charge pour une application donnée. Et tout cela est pris en charge, si vous le souhaitez, par votre compte Microsoft, que vous pouvez connecter à différents services, de Facebook à Twitter en passant par LinkedIn et d'autres. Au cours de cette semaine, nous allons rédiger une série de billets sur les nouvelles applications Microsoft en mettant l'accent sur le partage, la connexion et l'intégration avec Windows 8. Ce billet reprend le billet destiné aux développeurs issu de notre blog des développeurs d'applications Windows 8, qui a été rédigé par Derek Gebhard, chef de projet au sein de l'équipe Expérience utilisateur. --Steven


Si vous commencez à développer des applications de style Metro, vous rencontrerez très vite le concept de « contrat », un des concepts parmi les plus innovants et les plus novateurs de Windows 8. Les applications de style Metro utilisent en effet des contrats pour déclarer les interactions qu'elles peuvent prendre en charge avec les autres applications et avec Windows. Vous avez sans doute déjà entendu parler de certains de ces contrats : contrat de recherche, contrat de partage, etc. Grâce aux contrats, les applications deviennent encore plus performantes : elles communiquent avec le système ou avec d'autres applications lorsque l'utilisateur installe de nouvelles applications qui mettent en œuvre des contrats. Dans ce billet, je détaille pas à pas le processus d'activation, l'un des principaux concepts à connaître lorsque vous ajoutez des contrats à vos applications.

La plateforme d'activation de Windows permet de lancer des applications de style Metro et de leur envoyer une notification indiquant pourquoi l'utilisateur les a lancées. Les raisons varient : l'utilisateur peut avoir démarré l'application en utilisant la vignette de l'écran d'accueil ou par le biais d'une tâche spécifique (affichage des résultats de recherche, par exemple). Windows indique à votre application le motif de lancement et les éventuelles informations complémentaires requises pour accomplir la tâche. Avant l'introduction de notre plateforme d'activation Windows 8, ces informations étaient transmises aux applications par le biais de paramètres de ligne de commande. Avec notre nouveau modèle, nous prenons également en charge la transmission directe d'objets tels que StorageFile ou ShareOperation, entre autres, pour fournir un contexte à l'application. Grâce à toutes ces possibilités, vous réaliserez très vite à quel point les contrats sont extrêmement puissants. Examinons plus en détail les éléments à connaître pour prendre en charge le lancement via un contrat.

Contrats : lancement d'applications de style Metro dans un objectif et un contexte précis

Comme vous pouvez le constater à travers la démonstration de Windows 8 Consumer Preview, les contrats de Windows 8 assurent la liaison entre votre application et les autres applications de style Metro, mais aussi entre votre application et l'interface utilisateur du système. Par exemple, le contrat du sélecteur de fichiers à ouvrir permet à l'utilisateur d'importer les fichiers d'une application dans une autre application. À travers le contrat de recherche, les utilisateurs peuvent rechercher une application à partir de n'importe quel endroit du système et transférer rapidement une requête entre plusieurs applications. Dans toutes ces situations et dans bien d'autres scénarios entrant dans le cadre des contrats, Windows doit être en mesure de lancer directement votre application à un endroit précis de son interface utilisateur, pour permettre à l'utilisateur d'accomplir une tâche spécifique de façon rapide et efficace. C'est justement là que notre plateforme d'activation et notre API entrent en jeu.

Les utilisateurs peuvent initialiser des interactions entre des applications de deux manières :

  1. Par le biais d'une action nécessitant la mise au premier plan de la vue immersive intégrale de l'application. Il s'agit alors de ce que nous appelons une activation de vue principale. Le contrat de recherche fait partie des exemples les plus évidents.

    Le fait de cliquer sur une application dans le volet de recherche lance l'application et ouvre ses résultats de recherche.
    Exemple d'activation de vue principale
  2. Par le biais d'une action hébergée inline, sans quitter le contexte de l'application en cours d'exécution. On parle dans ce cas d'activation de vue hébergée. Voici deux exemples : une application participant au sélecteur de fichiers et une application utilisée comme cible de partage.

  3. La sélection d'une application dans le sélecteur provoque le lancement de l'interface utilisateur de l'application, dans laquelle l'utilisateur peut sélectionner un fichier.
    Exemple d'activation de vue hébergée dans le sélecteur


    Lancement de l'application Courrier par le biais de l'icône Partager, en vue du partage de la photo que je manipule.
    Exemple d'activation de vue hébergée pour les cibles de partage

    Voici les différences entre ces deux types d'activation :

    Activation de vue principale

    Activation de vue hébergée

    Elle est entièrement immersive et lance l'application en tant qu'application principale affichée à l'écran

    Elle effectue un rendu de l'interface utilisateur au sein même du chrome système

    Elle peut potentiellement être utilisée pour effectuer un grand nombre de tâches extrêmement diverses

    Elle est utilisée dans le cadre d'une tâche courte et guidée, et son code porte exclusivement sur la réalisation de cette tâche

    Elle figure dans la liste de basculement

    Elle ne figure jamais dans la liste de basculement

    Elle peut être fermée par le biais d'un mouvement de fermeture

    Elle ne modifie pas la vue de la fenêtre principale de l'application concernée

    Examinons maintenant ces modèles d'activation et appliquons-les à quelques scénarios courants que vous êtes susceptibles d'utiliser dans le cadre du développement de vos applications de style Metro.

    Scénario 1 : intégration dans votre application de l'activation par le biais d'une recherche

    Dans Windows 8, l'ajout d'une fonctionnalité de recherche par le biais du contrat de recherche permet à l'utilisateur de rechercher le contenu de votre application à tout moment, où qu'il se trouve dans l'interface du système. Si votre application correspond à l'application principale affichée à l'écran, l'utilisateur peut rechercher le contenu de cette application immédiatement, à l'aide de l'icône Rechercher. Dans le cas contraire, il peut sélectionner l'icône Rechercher, puis sélectionner votre application dans la liste affichée dans le volet de recherche, afin d'effectuer une recherche dans cette application.

    En prenant en charge l'activation par le biais d'une recherche, votre application peut être lancée à tout moment de façon à afficher les résultats de recherche d'une requête spécifique. À l'instar du lancement à partir de l'écran d'accueil, le lancement à partir du volet de recherche correspond à une activation de vue principale. Par conséquent, si vous mettez en place plusieurs contrats, votre application peut potentiellement être activée à partir de nombreux scénarios différents. Par ailleurs, votre application peut même recevoir cette activation alors qu'elle est déjà en cours d'exécution, par exemple lorsqu'un utilisateur souhaite utiliser votre vue principale de façon différente dans le cadre d'un scénario spécifique (affichage de résultats de recherche, par exemple). Pour que ce scénario fonctionne, voici quelques recommandations :

    • Retardez le chargement du code qui n'est pas indispensable au contrat de vue principale que votre application est censée gérer.
    • Séparez la logique d'initialisation générale, que vous utilisez pour tous les contrats, de la logique qui doit être mise en œuvre pour un contrat spécifique.
    • Veillez à ce que le code censé être exécuté une seule fois au lancement ne soit pas ajouté à votre gestionnaire d'activation, de sorte qu'il ne soit pas exécuté plusieurs fois.
    • Rechargez l'état et les paramètres antérieurs de l'application lors du lancement à partir d'un état arrêté, de façon à ce que l'utilisateur ait l'impression que votre application est toujours en cours d'exécution et connectée.

    Essayez les applications Store et Photos. Elles suivent particulièrement bien ces recommandations dans le cadre de l'activation par le biais d'une recherche.

    L'application Store affiche les résultats de recherche du terme « calendar ». Le volet de recherche est ouvert et l'utilisateur est en train de saisir une nouvelle requête de recherche.

    Recherche dans l'application Store

     

    L'application Photos est en cours d'exécution et affiche les résultats de recherche pour le terme « Vancouver ». Le volet de recherche est ouvert et la requête de recherche « vancouver » a été envoyée.

    Recherche dans l'application Photos

    Étudions de plus près comment prendre en charge correctement l'activation par le biais d'une recherche dans vos applications JavaScript et XAML.

    Applications JavaScript

    Dans le cas des applications de style Metro écrites en JavaScript, l'activation est exposée via l'événement WinJS.Application.onactivated. Cet événement est déclenché une fois que l'événement DOMContentLoaded est terminé, à condition que l'application ne soit pas déjà en cours d'exécution ou suspendue. Dans le cas contraire, l'événement est déclenché dès que Windows a besoin d'activer l'application. Les outils Visual Studio pour les applications JavaScript se chargent de l'inscription de cet événement dans default.js et fournissent une zone où vous pouvez ajouter le code qui sera exécuté lorsqu'une activation par lancement générique se produit, c'est-à-dire lorsque l'utilisateur lance votre application à partir de l'écran d'accueil.

    Pour étendre la prise en charge de l'activation par le biais d'une recherche dans votre application, procédez comme suit :

    1. Ajoutez la déclaration de recherche à votre manifeste en utilisant le concepteur de manifeste de Visual Studio.
    2. Dans la portée globale de votre code JavaScript, insérez le code d'initialisation général devant être exécuté à chaque démarrage de votre application, quelle qu'en soit la raison. Si une partie de ce code doit accéder au DOM, ajoutez le code au sein d'un gestionnaire d'événements DOMContentLoaded.
    3. Procédez à l'inscription, pour permettre l'activation du gestionnaire pour le contrat de recherche.
    4. Une fois que le contrat de recherche est activé pour votre application, accédez à la page des résultats de recherche et passez le queryText obtenu auprès des arguments de l'événement d'activation.

    Comme moi, vous souhaitez sans doute disposer d'une solution plus simple, permettant d'éviter cette procédure manuelle. Fort heureusement, vous pouvez utiliser les outils Visual Studio pour réaliser la plupart de ces opérations, en cliquant sur votre projet avec le bouton droit de la souris, en sélectionnant Ajouter > Nouvel élément, puis en choisissant Contrat de recherche dans la boîte de dialogue qui s'affiche. La majeure partie du code disponible ici, ainsi que l'interface utilisateur de recherche affichant les résultats conformément à nos consignes search ux, sont automatiquement créées pour vous. Vous devez cependant utiliser le framework WinJS.Navigation avec ces outils.

    Voici un extrait de code issu du fichier default.js de mon application de photo, illustrant la prise en charge de l'activation par contrat de recherche :

    // Register activated event handler
    WinJS.Application.addEventListener("activated", function (eventObject) {
    ...
    if (eventObject.detail.kind === appModel.Activation.ActivationKind.launch) {
    ...
    } else if (eventObject.detail.kind === appModel.Activation.ActivationKind.search) {
    uri = searchPageURI;
    pageParameters = { queryText: eventObject.detail.queryText };
    }
    // Indicate to the system that the splash screen must not be torn down
    // until after processAll and navigate complete asynchronously.
    if (uri) {
    eventObject.setPromise(ui.processAll().then(function () {
    return nav.navigate(uri, pageParameters);
    }));
    }
    });

    Applications XAML

    Dans le cas des applications de style Metro écrites en XAML, la classe Windows.UI.Xaml.Application réalise la majeure partie du travail requis pour que votre application prenne en charge l'activation. Cette classe expose différentes méthodes d'activation fortement typées, que vous pouvez écraser pour prendre en charge les contrats courants tels que le contrat de recherche. Pour toutes les activations par contrat qui ne possèdent pas de méthode fortement typée, vous pouvez écraser la méthode OnActivated et examiner le type d'activation, afin de déterminer le contrat pour lequel votre application est activée.

    Dans Visual Studio, les nouveaux projets d'application XAML contiennent du code généré utilisant la classe Windows.UI.Xaml.Application, afin de permettre l'activation de l'application par lancement générique. Le code gérant cette activation se trouve dans la représentation de classe de votre application, disponible dans les fichiers App.xaml.cs/cpp/vb.

    Pour étendre la prise en charge de l'activation par le biais d'une recherche dans votre application, procédez comme suit :

    1. Ajoutez la déclaration de recherche à votre manifeste en utilisant le concepteur de manifeste de Visual Studio.
    2. Dans le constructeur d'application des fichiers App.xaml.cs/cpp/vb, insérez le code d'initialisation général devant être exécuté à chaque démarrage de votre application, quelle qu'en soit la raison.
    3. Écrasez la méthode OnSearchActivated fortement typée figurant dans App.xaml.cs/cpp/vb afin de gérer l'activation par le biais d'une recherche.
    4. Chargez votre interface utilisateur de recherche et affichez les résultats de la requête reçue dans SearchActivatedEventArgs.

    Là encore, comme pour les applications JavaScript, il existe une solution plus simple, permettant d'éviter cette procédure manuelle. Vous pouvez ainsi utiliser les outils Visual Studio pour réaliser la majeure partie de ces opérations. Pour cela, cliquez avec le bouton droit de votre souris sur le projet, sélectionnez Ajouter > Nouvel élément, puis sélectionnez Contrat de recherche dans la boîte de dialogue qui s'affiche. La majeure partie du code disponible ici, ainsi que l'interface utilisateur de recherche affichant les résultats conformément à nos consignes Search UX, sont automatiquement créées pour vous.

    Voici quelques extraits de code C# issus de mon application de photo, illustrant la prise en charge de l'activation par contrat de recherche.

    Nous devons écraser la méthode OnSearchActivated pour prendre en charge l'activation par le biais d'une recherche.

    protected override void OnSearchActivated(SearchActivatedEventArgs args)
    {
    // Load Search UI
    PhotoApp.SearchResultsPage.Activate(args.QueryText);
    }

    La méthode Activate de SearchResultsPage configure une interface utilisateur affichant les résultats de la requête de recherche de l'utilisateur :

    // SearchResultsPage.xaml.cs code snippet 
    public static void Activate(String queryText)
    {
    // If the window isn't already using Frame navigation, insert our own frame
    var previousContent = Window.Current.Content;
    var frame = previousContent as Frame;
    if (frame == null)
    {
    frame = new Frame();
    Window.Current.Content = frame;
    }
    // Use navigation to display the results, packing both the query text and the previous
    // Window content into a single parameter object
    frame.Navigate(typeof(SearchResultsPage1),
    new Tuple<String, UIElement>(queryText, previousContent));
    // The window must be activated in 15 seconds
    Window.Current.Activate();
    }

    La logique et les principes présentés ici ne s'appliquent pas uniquement à la prise en charge de l'activation par le biais d'une recherche. Vous pouvez utiliser les mêmes techniques pour prendre en charge les contrats de protocole, d'association de fichiers et de lecture automatique sur les périphériques, car il s'agit également de contrats d'activation de vue principale.

    Scénario 2 : intégration dans votre application de l'activation par le biais du sélecteur de fichiers à ouvrir

    Une application de style Metro peut appeler le sélecteur de fichiers pour permettre à l'utilisateur d'explorer le système de fichiers et de sélectionner des fichiers ou des dossiers sur lesquels l'application doit agir, ou pour lui permettre d'enregistrer un fichier en utilisant un nouveau nom, un autre type de fichier ou un autre emplacement (« Enregistrer sous »). Les applications peuvent également utiliser le sélecteur de fichiers comme interface pour permettre à d'autres applications d'accéder à des fichiers, à un emplacement d'enregistrement ou à des mises à jour de fichiers. En intégrant le contrat du sélecteur de fichiers à ouvrir, vous permettez à l'utilisateur de sélectionner des fichiers de votre application directement à partir d'une autre application. L'utilisateur profite ainsi de plus de liberté et de flexibilité lors du choix des fichiers stockés et présentés par votre application.

    Le lancement d'une application via le contrat du sélecteur de fichiers à ouvrir entre dans le cadre d'une activation de vue hébergée. L'interface utilisateur de l'application est hébergée dans le sélecteur de fichiers et le code exécuté pour cette activation doit couvrir exclusivement la tâche permettant à l'utilisateur de sélectionner ses fichiers. Pour que l'utilisateur profite d'une expérience optimale, votre application doit être la plus rapide possible. Aussi, vous ne devez pas charger le moindre code ni la moindre bibliothèque qui n'est pas indispensable à la tâche d'activation de vue hébergée.

    Je vous recommande d'examiner l'application SkyDrive. Elle constitue un exemple idéal en matière d'activation par le biais du sélecteur de fichiers à ouvrir. En outre, elle couvre exclusivement la tâche permettant à l'utilisateur de sélectionner ses fichiers.

    Le sélecteur est en cours d'exécution et permet à l'utilisateur de sélectionner un fichier à partir de son application SkyDrive.

    Prise en charge du sélecteur de fichiers à ouvrir dans l'application SkyDrive

    Étudions de plus près comment prendre en charge correctement l'activation par le biais du sélecteur de fichiers à ouvrir au sein de vos applications JavaScript et XAML.

    Applications JavaScript

    Dans le cas des applications de style Metro écrites en JavaScript, l'activation de vue hébergée suit les mêmes principes que l'activation de vue principale, à une exception près, mais essentielle : l'activation de vue hébergée a toujours lieu dans une nouvelle fenêtre dans un nouveau contexte de script. Par conséquent, le code que vous utilisez pour gérer cette activation ne peut pas accéder aux bibliothèques, aux variables globales, ni au DOM de votre application principale.

    Pour étendre votre application de sorte qu'elle prenne en charge l'activation par le biais du sélecteur de fichiers à ouvrir, procédez comme suit :

    1. Créez une page HTML spécialement conçue pour gérer uniquement le contrat du sélecteur de fichiers à ouvrir.
    2. Ajoutez la déclaration du sélecteur de fichiers à ouvrir dans le concepteur de manifeste Visual Studio et définissez la page HTML nouvellement créée comme page d'accueil.
    3. Pour améliorer les performances, vous ne devez charger dans cette page que le code JavaScript et les autres ressources indispensables à la prise en charge du contrat du sélecteur de fichiers à ouvrir.
    4. Structurez le gestionnaire d'événements d'activation de sorte qu'il gère uniquement l'activation par le biais du contrat du sélecteur de fichiers à ouvrir. Ce gestionnaire n'est appelé qu'une seule fois pendant la durée de vie de la tâche de sélection de fichiers.
    5. Utilisez les arguments de l'événement d'activation pour interagir avec le sélecteur de fichiers.

    Pour gagner du temps, vous pouvez utiliser les outils Visual Studio pour réaliser ces opérations. Pour cela, cliquez avec le bouton droit de votre souris sur le projet, sélectionnez Ajouter > Nouvel élément, puis sélectionnez Contrat du sélecteur de fichiers dans la boîte de dialogue qui s'affiche. La plupart des éléments que vous voyez ensuite sont créés automatiquement dans votre projet.

    Voici un extrait de code issu du fichier fileOpenPicker.js de mon application de photo, permettant l'activation par le biais du sélecteur de fichiers à ouvrir :

    // Register activated event handler for handling File Open Picker activation
    WinJS.Application.addEventListener("activated", function (eventObject) {
    if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.fileOpenPicker) {
    pickerUI = eventObject.detail.fileOpenPickerUI;
    pickerUI.onfileremoved = fileRemovedFromPickerUI;
    ...
    }
    });

    WinJS.Application.start();

    Applications XAML

    Dans le cas des applications de style Metro écrites en XAML, la prise en charge de l'activation de vue hébergée est similaire à celle de l'activation de vue principale. La principale différence réside dans le fait que votre application doit maintenant créer un thread et une fenêtre pour gérer l'activation. Le modèle de code Visual Studio gère l'ensemble du travail requis et crée pour vous le thread et la fenêtre en vue des activations de vue hébergée.

    Pour gérer l'activation par le biais du sélecteur de fichiers à ouvrir dans votre application XAML, procédez comme suit :

    1. Ajoutez la déclaration du sélecteur de fichiers à ouvrir à votre manifeste en utilisant le concepteur de manifeste de Visual Studio.
    2. Écrasez la méthode OnFileOpenPickerActivated App.xaml.cs/cpp/vb et chargez la page qui gérera ce contrat.
    3. Passez FileOpenPickerActivatedEventArgs à la page gérant ce contrat, pour qu'elle puisse interagir avec le sélecteur de fichiers.

    Pour gagner du temps, vous pouvez utiliser les outils Visual Studio pour réaliser ces opérations. Pour cela, cliquez avec le bouton droit de votre souris sur le projet, sélectionnez Ajouter > Nouvel élément, puis sélectionnez Contrat du sélecteur de fichiers dans la boîte de dialogue qui s'affiche. La plupart des éléments que vous voyez ensuite sont créés automatiquement dans votre projet.

    Voici un extrait de code C# issu de mon application de photo, permettant l'activation par le biais du sélecteur de fichiers à ouvrir :

    // App.xaml.cs code snippet
    protected override void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args)
    {
    var fileOpenPickerPage = new PhotoApp.FileOpenPickerPage();
    fileOpenPickerPage.Activate(args);
    }

    // FileOpenPickerPage.xaml.cs code snippet
    public void Activate(FileOpenPickerActivatedEventArgs args)
    {
    this._fileOpenPickerUI = args.FileOpenPickerUI;
    this._fileOpenPickerUI.FileRemoved += FileOpenPickerUI_FileRemoved;

    // Show the user’s photos in the Picker UI
    ...

    Window.Current.Content = this;
    // The window must be activated in 15 seconds
    Window.Current.Activate();
    }

    La logique et les principes présentés ici ne s'appliquent pas uniquement à la prise en charge de l'activation par le biais du sélecteur de fichiers à ouvrir. Vous pouvez utiliser les mêmes techniques pour prendre en charge les contrats de partage cible, du sélecteur de fichiers à enregistrer, du sélecteur de contacts, de paramètres de caméra et de paramètres des tâches d'impression, car il s'agit également de contrats d'activation de vue hébergée.

    Pour conclure

    Je vous ai montré comment le contrat de recherche, le contrat du sélecteur de fichiers et les autres contrats Windows 8 vous permettent de guider les utilisateurs vers votre application en réalisant une tâche spécifique à partir d'autres zones du système, et même à partir d'autres applications dans certaines situations. Les utilisateurs s'attendent à ce que ces fonctionnalités soient rapides et fluides dans votre application, car Windows et votre application sont tous deux au courant de cette intention et de la tâche qu'ils essaient d'accomplir. Il est indispensable d'implémenter correctement l'activation de votre application pour proposer une expérience utilisateur optimale dans le cadre de ces contrats. Même si vous travaillez uniquement sur le cœur de l'application et que vous n'utilisez pas de contrats, ces quelques conseils restent utiles pour configurer l'activation par lancement générique. Ainsi, vous pourrez étendre facilement votre application par la suite, de façon à prendre en charge les contrats sans revoir entièrement votre code.

    Les points à ne pas oublier :

    1. Insérez la logique d'initialisation générale de l'application à un endroit où elle sera exécutée indépendamment de la façon dont votre application est activée.
    2. Vos gestionnaires d'activation peuvent être exécutés même si votre application est déjà en cours d'exécution ou suspendue. Veillez à ce que cela n'ait pas de conséquence inattendue sur votre application.
    3. Les outils Visual Studio peuvent réaliser à votre place une partie du travail nécessaire à la prise en charge du contrat de recherche, du contrat de partage et du contrat du sélecteur de fichiers à ouvrir. Il vous suffit pour cela de cliquer avec le bouton droit de la souris sur le projet, puis de sélectionner Ajouter > Nouvel élément.
    4. Lors de la réception d'une activation de vue hébergée, chargez uniquement le code requis pour accomplir la tâche associée à l'activation.

    Pour en savoir plus sur l'activation et les contrats dans Windows 8, vous pouvez cliquer sur les liens ci-dessous ou poser des questions dans nos forums.

    Documentation

    Exemples

    Merci !

    Derek Gebhard
    Chef de projet, Expérience utilisateur Windows

    Contributions : Jake Sabulsky, Marco Matos, Daniel Oliver

  • Loading...
Leave a Comment
  • Please add 5 and 5 and type the answer here:
  • Post