none
Si j'utilise Clipboard.SetContent, les applications sur lesquelles je colle se figent un moment après le collage RRS feed

  • Question

  • Dans mon application universelle, je reçois des données puis je dois envoyer des données vers le Presse-papier.

    Mon DataPack est déclaré de cette façon :

        PrivatedataPack AsNewDataPackageWith{.RequestedOperation = DataPackageOperation.Copy}

    J'ajoute du texte dans le DataPack :

        dataPack.SetText(foobar.ToString())

    Enfin, je charge le DataPack sur le Clipboard :

        Clipboard.SetContent(dataPack)

    J'ai un DispatcherTimer qui me permet de réessayer le .SetContent lorsqu'il échoue.

    Je ferme mon application après cette opération.

    Problème :

    Quand je pars dans un programme Windows pour coller le contenu du Presse-papier, le texte est bel et bien collé, mais juste après, le programme en question (cible) lag, freeze et ne répond pas durant une dizaine de secondes.

    Ceci arrive dans Exécuter (Run ; Win+R), dans OneNote, Telegram Desktop, Kiwix (barre de recherche), et quelques autres programmes, mais pas dans Bloc-notes (Notepad).

    Autre souci : Le contenu ne peut être collé qu'une seule fois – c'est-à-dire que le Presse-papier est vidé –, malgré le fait que je déclare .RequestedOperation = DataPackageOperation.Copy.

    Des idées ?

    dimanche 27 septembre 2015 19:33

Réponses

  • Je me permet de rouvrir le sujet parce que j'ai trouvé quelque chose d'intéressant en essayant de copier une Bitmap avec :

    DataPackage.SetBitmap(value As RandomAccessStreamReference)

    Clipboard.SetContent(content As DataPackage)

    Ce qui se passait, c'est que juste après que l'application ait été fermée, le contenu du Presse-papier n'était plus disponible.

    Ceci veut dire que l'action d'ajouter un DataPackage au Clipboard crée un contrat de données qui est valable tant que l'application est ouverte (genre de contrats utilisés pour le partage).

    Alors j'ai trouvé cela :

    '
            ' Résumé :
            '     Place le contenu dans le Presse-papiers et libère l'objet DataPackage de l'application
            '     source. Cette méthode permet au contenu de rester disponible une fois que l'application
            '     est arrêtée.
            Public Shared Sub Flush()
    

    Donc :

    Clipboard.SetContent(content As DataPackage)
    Clipboard.Flush()

    Il semblerait donc que tant que le « contenu n'est pas placé dans le Presse-papier », le contrat de données reste actif.

    Maintenant, après la copie, l'application peut être fermée sans souci.

    Je ne sais pas si le fait de faire suivre les instructions sans délai avec un Timer génère un problème, c'est à essayer.


    Le cœur de la Terre bat au rythme lent d'un serpent de mer.



    • Marqué comme réponse Jahus vendredi 2 octobre 2015 11:32
    • Modifié Jahus vendredi 2 octobre 2015 11:33
    vendredi 2 octobre 2015 11:31

Toutes les réponses

  • Bonjour, Jahus,

    Pouvez-vous désactiver Le DispatcherTimer et essayer de compléter l'opération de nouveau pour voir s'il ya un bug ou pas ?
    Je voudrais vous demander de ne pas fermer l'application et de réessayer l'opération - le souci persiste-t-il ?
    Merci de nous tenir au courant.

    Cordialement,
    Teodora


    Votez! Appel à la contribution TechNet Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 28 septembre 2015 13:35
    Modérateur
  • Voici ce que j'ai essayé après avoir lu votre réponse :

    ProtectedOverridesSubOnNavigatedTo(ByVale AsNavigationEventArgs)

         dataPack.SetText("Hello, World!")

         Try

              Clipboard.SetContent(dataPack)

         Catchex AsException

              SetStatus("Error putting something in clipboard!")

         EndTry

    Ce qui se passe :

    Tant que l'application est ouverte : Je peux coller où je veux, sans ralentissement, autant de fois que je veux.

    Si je ferme l'application : Je ne peux plus coller (le contenu du Clipboard est une chaîne nulle, donc quand je colle et que j'ai auparavant sélectionné du texte, ça le remplace par une chaîne nulle).

    En suite, voici ce que j'ai essayé :

    J'avais :

        dataPack.SetText(genLink.ToString())

    Et je l'ai remplacé par :

        dataPack.SetText("Hello ;)")

    Idem. Si l'application est ouverte, tout fonctionne, mais dès qu'elle est fermée, il y a le lag, le blocage et on ne peut plus coller qu'une seule fois.

    Notons que j'ai gardé le DispatcherTimer vu que mon essaie précédent hors-Timer posait problème aussi.

    Ajouts :

    L'application s'ouvre aussi en "partage" (le menu charme Partager), elle se ferme après la fin de l'opération quand on clique sur un bouton qui appelle :

        shareOperation.ReportCompleted()

    J'ai en suite remarqué que si on évite d'appuyer sur le bouton en question, mais qu'on clique juste dans la zone en dehors du menu charme Partager, le problème ne se posait plus (je ne sais pas si c'est temporaire).

    J'ai donc essayé de remplacer .ReportCompleted() par .DismissUI(), mais même souci.

    Résumé

    Je comprends que le contenu du Presse-papier reste d'une certaine façon "lié" à l'application, mais y a-t-il un moyen d'éviter ça ?

    J'ai essayé :

       DataPackageOperation.None

    Au lieu de :

        DataPackageOperation.Copy

    J'ai même essayé de ne pas définir ce paramètre (j'imagine que None est la valeur par défaut), mais cela donne le même résultat.

    Mais je viens d'essayer le SetText("Hello, World!") comme décrit au début, sans le paramtère RequestedOperation – Changement notable : Je peux coller même après que l'application soit fermée (les collages suivants ne génèrent pas de lag).

    De là, je suis revenu à .DismissUI() au lieu de .ReportCompleted(), le problème a l'air d'être réglé, mais après un moment, si on lance une instance indépendante, et qu'on essaie de la fermer, on reçoit le message "Cette application est utilisée pour un partage".

    Merci de votre aide.

    Jahus

    • Modifié Jahus lundi 28 septembre 2015 22:41
    lundi 28 septembre 2015 22:25
  • Suite :

    Je pense avoir réussi à "contourner" le problème.

    Ce que je fais dans le menu de partage, c'est quitter l'application avec App.Current.Exit() juste après ShareOp.ReportCompleted().

    Les instructions se suivent, ce qui crée, par moments, une "erreur de partage", comme si le .ReportCompleted() n'avait pas le temps d'opérer.

    Je contourne ça en faisant que .Exit() soit exécutée par le DispatcherTimer 250 millisecondes après .ReportCompleted().

    Notons que quand je mets .ReportStarted() dans ce cas, le collage crée une erreur de partage.

    Conclusion

    Il semblerait que la gestion du Partage et du Clipboard met en branle des fonctions asynchrones qui ont besoin d'un certain temps pour s'exécuter. Il est dommage de ne pas avoir des événements qui peuvent être gérés à la fin des tâches de ces actions-là.

    Aussi, il faut parfois s'y reprendre à deux fois pour insérer une donnée dans le presse-papier et que par moments, cela génère un "access denied".

    Encore merci de votre aide, ce fut très plaisant.

    Jahus

    • Marqué comme réponse Teodora SharkovaModerator mercredi 30 septembre 2015 12:50
    • Modifié Jahus vendredi 2 octobre 2015 11:23
    • Non marqué comme réponse Jahus vendredi 2 octobre 2015 11:34
    lundi 28 septembre 2015 23:26
  • Je me permet de rouvrir le sujet parce que j'ai trouvé quelque chose d'intéressant en essayant de copier une Bitmap avec :

    DataPackage.SetBitmap(value As RandomAccessStreamReference)

    Clipboard.SetContent(content As DataPackage)

    Ce qui se passait, c'est que juste après que l'application ait été fermée, le contenu du Presse-papier n'était plus disponible.

    Ceci veut dire que l'action d'ajouter un DataPackage au Clipboard crée un contrat de données qui est valable tant que l'application est ouverte (genre de contrats utilisés pour le partage).

    Alors j'ai trouvé cela :

    '
            ' Résumé :
            '     Place le contenu dans le Presse-papiers et libère l'objet DataPackage de l'application
            '     source. Cette méthode permet au contenu de rester disponible une fois que l'application
            '     est arrêtée.
            Public Shared Sub Flush()
    

    Donc :

    Clipboard.SetContent(content As DataPackage)
    Clipboard.Flush()

    Il semblerait donc que tant que le « contenu n'est pas placé dans le Presse-papier », le contrat de données reste actif.

    Maintenant, après la copie, l'application peut être fermée sans souci.

    Je ne sais pas si le fait de faire suivre les instructions sans délai avec un Timer génère un problème, c'est à essayer.


    Le cœur de la Terre bat au rythme lent d'un serpent de mer.



    • Marqué comme réponse Jahus vendredi 2 octobre 2015 11:32
    • Modifié Jahus vendredi 2 octobre 2015 11:33
    vendredi 2 octobre 2015 11:31