2010-08-05 14 views
3

J'ai utilisé vb.net 2003 et certaines fois cette erreur se produit. Quelqu'un peut-il savoir comment cette erreur se pose et comment y remédier?L'opération de presse-papiers demandée a échoué

Erreur: L'opération de presse-papiers n'a pas demandé

+0

Quel code utilisez-vous? –

+1

Ce serait une meilleure question s'il y avait plus de détails .... – David

+0

Qu'est-ce que vous essayez de faire dans le presse-papiers? Copiez-vous, collez, effacez-vous, surveillez-vous, etc.? Initié par l'utilisateur ou automatisé? Aide-moi à t'aider. Améliorez votre question et je vais la changer, et essayer de vous aider. –

Répondre

5

Je googlé cette question pour voir ce que je vois, et beaucoup de gens ont posé cette question, et aucun d'entre eux ont obtenu une réponse solide ...

Je suis donc allé à la documentation MSDN et j'ai trouvé une note qui explique ce que la plupart des gens qui ont posé cette question décrivent ... Le symptôme apparaît généralement lorsque l'utilisateur passe à une autre application pendant que le code fonctionne. La note est citée ci-dessous, le lien vers la documentation suivante:

All Windows-based applications share the system Clipboard, so the contents are subject to change when you switch to another application.

An object must be serializable for it to be put on the Clipboard. If you pass a non-serializable object to a Clipboard method, the method will fail without throwing an exception. See System.Runtime.Serialization for more information on serialization. If your target application requires a very specific data format, the headers added to the data in the serialization process may prevent the application from recognizing your data. To preserve your data format, add your data as a Byte array to a MemoryStream and pass the MemoryStream to the SetData method.

The Clipboard class can only be used in threads set to single thread apartment (STA) mode. To use this class, ensure that your Main method is marked with the STAThreadAttribute attribute.

Special considerations may be necessary when using the metafile format with the Clipboard. Due to a limitation in the current implementation of the DataObject class, the metafile format used by the .NET Framework may not be recognized by applications that use an older metafile format. In this case, you must interoperate with the Win32 Clipboard application programming interfaces (APIs). For more information, see article 323530, "Metafiles on Clipboard Are Not Visible to All Applications," in the Microsoft Knowledge Base at http://support.microsoft.com .

http://msdn.microsoft.com/en-us/library/system.windows.forms.clipboard.aspx

Curieusement, cela a du sens d'un comportement étrange, j'ai remarqué dans un de mes propres applications. J'ai une application qui écrit dans une feuille de calcul Excel (en réalité, pour des centaines d'entre eux, modifiant des centaines de cellules chacun). Je n'utilise pas du tout le presse-papiers, juste l'API Interop pour Excel, mais quand il est en cours d'exécution, mon presse-papiers disparaît chaque fois qu'une nouvelle feuille de calcul est créée. Dans mon cas, Excel est en train de jouer avec le presse-papiers, même s'il n'y a aucune raison discernable de le faire. Je craquerais pour un de ces phénomènes mystérieux de Windows que nous, les mortels, ne comprendrons jamais. Quoi qu'il en soit, grâce à votre question, je pense que je comprends mon problème, donc +1 à vous pour m'aider.

0

Y a-t-il une chance que UltraVNC soit en cours d'exécution? J'ai des problèmes lorsque cette application s'exécute en arrière-plan sur le PC côté client. Lorsque je ferme VNC, je peux copier dans le presse-papiers avec succès. Ce n'est pas vraiment une solution satisfaisante mais au moins je sais dans mon cas la source du problème.

1

J'ai cette erreur en essayant de:

Clipboard.Clear(); 
... 
Clipboard.SetText(...); 

Pour le résoudre, je remplacerai Clipboard.Clear() avec pinvoking quelques méthodes de la user32.dll:

[DllImport("user32.dll")] 
static extern IntPtr GetOpenClipboardWindow(); 

[DllImport("user32.dll")] 
private static extern bool OpenClipboard(IntPtr hWndNewOwner); 

[DllImport("user32.dll")] 
static extern bool EmptyClipboard(); 

[DllImport("user32.dll", SetLastError=true)] 
static extern bool CloseClipboard(); 

... 

IntPtr handleWnd = GetOpenClipboardWindow(); 
OpenClipboard(handleWnd); 
EmptyClipboard(); 
CloseClipboard(); 

... 

Clipboard.SetText(...); 

J'utilise C#, mais la version vb pourrait être facilement créé à partir de celui-ci.