Archives

Posts Tagged 'clipboard'

Clipboard Silverlight API

18 novembre 2009 7 commentaires

API Clipboard dans Silverlight

Silverlight 4 ajoute le support presse-papiers. Consultez les démos étonnantes par Scott Guthrie et Brian Goldfarb aujourd'hui au PDC que les scénarios vitrine activé par l'appui Silveilght4 Presse-papiers.

API Clipboard Silverlight est un sous-ensemble de WPF Clipboard API:

  publique Clipboard classe statique 
{
public static bool ContainsText ();
publique GetText chaîne statique ();
text); public static void setText (string text);
}

Il permet de copier / coller des chaînes Unicode vers / depuis le presse-papiers du système. GetText et SetText nécessitent soit de suivre pour réussir:

  1. l'application appelante Silverlight est une application de confiance élevée, ou
  2. il est initié par l'utilisateur et l'accès utilisateur accorde presse-papiers

Pour le second cas, quand gettext ou SetText est d'abord appelé à une gestion des événements initiée par l'utilisateur, Silverlight affiche une boîte de dialogue comme ci-dessous (IU peuvent changer à RTW):

    Clipboard Prompt
    Si l'utilisateur clique oui, Silverlight permettra cela et plus tard, GetText / SetText appels de réussir pour cette application au cours de cette session; si l'utilisateur clique pas, par défaut, Silverlight jeter une SecurityException . En un mot, le réglage est par application, par session, à la fois pour obtenir et définir l'accès au presse-papiers du système, et il n'est pas persisté.

API Clipboard en JavaScript et WPF

Nous devons examiner de nombreux facteurs lors de la conception API Clipboard pour Silverlight. Parmi eux, les API Clipboard de JavaScript et WPF sont particulièrement intéressants, car nous avons besoin d'étudier les leçons de sécurité en JavaScript et essayez d'être compatible avec WPF.

Il n'ya pas de navigateur croix, cross-platform API JavaScript pour accéder à presse-papiers. IE fournit clipboardData objet qui permet get / set / cordes clair dans le presse-papiers du système:

bResult = window.clipboardData.setData (sDataFormat, sData);

sData = window.clipboardData.getData (sDataFormat);

bResult = window.clipboardData.clearData ([sDataFormat]);

où sDataFormat est une chaîne constante du "Texte" ou "URL", sData est une chaîne, et bResult est un booléen.

La première fois que l'objet est accessible clipboadData, IE demandera à l'utilisateur pour permettre le script d'accéder à presse-papiers, et le réglage est valable pour la seule session.

API Clipboard WPF supporte plus et extensible de format de données via IDataObject , et a des fonctions d'aide pour les formats courants comme du texte, image, audio et FileDrop .

 publique Clipboard classe statique 
{
[SecurityCritical]
public static void Clear ();

public static bool ContainsAudio ();
format); public static bool ContainsData (format string);
publique ContainsFileDropList static bool ();
public static bool ContainsImage ();
public static bool ContainsText ();
public static bool ContainsText (format TextDataFormat);
Flux statiques publics GetAudioStream ();
format); objet statique publique GetData (format string);
[SecurityCritical]
public static IDataObject GetDataObject ();
publique GetFileDropList StringCollection statiques ();
public static BitmapSource GetImage ();
publique GetText chaîne statique ();
public static GetText (format TextDataFormat);

publique IsCurrent static bool (IDataObject données);

[] audioBytes); public static void SetAudio (byte [] audioBytes);
public static void SetAudio (Stream Audiostream);
format, object data); public static void SetData (format de chaîne, les données objet);
[SecurityCritical]
data); public static void SetDataObject (données objet);
[SecurityCritical]
data, bool copy); public static void SetDataObject (données de l'objet, copier bool);
publique SetFileDropList static void (fileDropList StringCollection);
public static void SetImage (BitmapSource image);
text); public static void setText (string text);
text, TextDataFormat format); public static void setText (string text, format TextDataFormat);
}

API Clipboard dans Windows et Mac OS X

. API Silverlight presse-papiers est finalement mis en œuvre sur le dessus de l'API presse-papiers du système d'exploitation sous-jacent API presse-papier Windows sont documentées sur MSDN, ci-dessous extrait donne un aperçu sur la façon de définir / obtenir des données presse-papiers:

Opérations Couper et Copier

Pour placer l'information sur le presse-papiers, une fenêtre dégage d'abord de tout contenu clipboard précédente en utilisant le EmptyClipboard fonction. Cette fonction envoie le WM_DESTROYCLIPBOARD message au propriétaire clipboard précédente, libère les ressources associées à des données sur le presse-papiers, et assigne la propriété clipboard à la fenêtre qui a le Presse-papiers ouvert. Pour savoir quelle fenêtre est propriétaire du presse-papiers, appelez le GetClipboardOwner fonction.

Après avoir vidé le presse-papiers, la fenêtre des lieux des données sur le presse-papiers en tant que formats de planchette que possible, commandé par le format Presse-papiers les plus descriptives pour le moins descriptive. Pour chaque format, la fenêtre des appels du SetClipboardData fonction, en spécifiant l'identificateur de format et d'une poignée de mémoire globale. La poignée de la mémoire peut être NULL, ce qui indique que la fenêtre rend les données sur demande. Pour plus d'informations, consultez Rendu retardée .

Les opérations de collage

Pour récupérer les informations coller à partir du presse-papiers, une fenêtre détermine d'abord le format Presse-papiers pour récupérer. Typiquement, une fenêtre énumère les formats presse-papiers disponibles en utilisant le EnumClipboardFormats fonction et utilise le premier format qu'il reconnaît. Cette méthode sélectionne le meilleur format disponible en fonction de la priorité accordée lorsque les données ont été mis sur le presse-papiers.

Alternativement, une fenêtre peut utiliser le GetPriorityClipboardFormat fonction. Cette fonction identifie le meilleur format de presse-papiers disponibles en fonction de la priorité spécifiée. Une fenêtre qui ne reconnaît qu'un seul format de presse-papiers peut tout simplement déterminer si ce format est disponible en utilisant le IsClipboardFormatAvailable fonction.

Après avoir déterminé le format à utiliser le presse-papiers, une fenêtre appelle le GetClipboardData fonction. Cette fonction retourne le handle à un objet mémoire globale contenant des données dans le format spécifié. Une fenêtre peut brièvement verrouiller l'objet de la mémoire afin d'examiner ou de copier les données. Cependant, une fenêtre ne doit pas libérer l'objet ou le laisser enfermé pendant une longue période de temps.

Pour l'instant, Clipboard Silverlight API prend en charge que CF_UNICODETEXT format pour copier / coller du texte Unicode vers / depuis le presse-papiers.

Mac OS X utilise directeur de carton . Il est documenté au Mac Dev Center . Ci-dessous extrait (avec les API ajoutée) donne un aperçu:

L'application de copie est responsable de la mise des données copiées ou coupées sur la table de montage:

  1. L'utilisateur sélectionne certaines données et invoque le copier (ou couper) élément de menu.

  2. Si l'application ne possède pas déjà une référence à la table de montage Presse-papiers, il crée un ( PasteboardCreate ).

  3. L'application prend alors la propriété de la table de montage et efface le contenu actuel ( PasteboardClear ).

  4. L'application assigne des ID élément pour les données sélectionnées.

  5. Si des données est d'être promis, l'application doit enregistrer une fonction callback promettent le gardien de fournir les données promises ( PasteboardSetPromiseKeeper ).

  6. L'application ajoute un ou plusieurs saveurs de chaque élément à la table de montage, y compris les données, soit la saveur réelle ou une promesse à chaque saveur ( PasteboardPutItemFlavor ).

L'application réceptrice possède un ensemble légèrement différent de tâches pour gérer l'action Coller:

  1. Lorsque l'application est active, il vérifie pour voir si le carton a été modifié ( PasteboardSynchronize ). Si oui, il obtient une liste des saveurs sur le carton. S'il ya des saveurs de l'application prend en charge, il peut permettre son élément de menu Coller.

  2. L'utilisateur appelle la commande Coller.

  3. Les demandes d'application de l'article (ou articles) sur la table de montage dans les saveurs qui la soutient

  4. Si les données collées doit être stocké dans un fichier, l'application réceptrice doit définir un emplacement pâte avant de demander des données saveur. Dans tout autre cas, l'application de réception n'a pas besoin de s'inquiéter de savoir si les données pâte a été promis ou non.

Si le gardien promis à l'application de copie est appelé, le rappel doit faire ce qui suit:

  • Si les données doivent être stockées dans un fichier, déterminer l'emplacement coller spécifié par l'application réceptrice.

  • Générer ou les préparer autrement les données promises pour le transfert.

  • Si les données promises n'est pas être stockées dans un fichier, ajouter la saveur et les données à la table de montage. Sinon, le transfert des données a promis de l'emplacement du fichier spécifié.

Quelque temps plus tard, lorsque l'application se ferme, ou quand il n'a plus besoin de la table de montage, l'application peut libérer la référence carton.

Comme sur Windows, l'API Silverlight utilise seulement Clipboard kPasteboardClipboard et kUTTypeUTF16PlainText saveur pour soutenir un copier / coller du texte Unicode vers / depuis le presse-papiers.

Commentaires

Nous sommes ravis d'ajouter le support presse-papiers à Silverlight, et voir tous les scénarios importants permis par cette API simple. Je suis intéressé à entendre vos retours, en particulier:

  • tout problème de sécurité sur le presse-papiers Silverlight conception API et mise en œuvre
  • combien il est important d'ajouter le support pour d'autres données de type / format, et par ordre de priorité ce
  • combien il est important de faire le extensibles API, comme le soutien IDataObject , permettant de format personnalisé / saveur et de rendu différé / données promises
    Merci!
      -Ning
      Technorati Tags: ,