Wie man mit einem blockierten Zwischenablage und andere Merkwürdigkeiten
Im Laufe der letzten paar Stunden habe ich schon das aufspüren einer Recht spezifischen Fehler mit der, die Auftritt, weil eine andere Anwendung die Zwischenablage öffnen. Im wesentlichen wie die Zwischenablage ist eine gemeinsame Ressource (wie pro "Warum hat meine freigegebene Zwischenablage nicht funktioniert?") und Sie versuchen, führen Sie
Clipboard.SetText(string)
oder
Clipboard.Clear().
Folgende exception geworfen wird:
System.- Laufzeit.InteropServices.ExternalException: Angeforderte Clipboard-Vorgang war nicht erfolgreich. System.Windows.Formen.Zwischenablage.ThrowIfFailed(Int32 hr) System.Windows.Formen.Zwischenablage.SetDataObject(Object data, Boolean copy, Int32 retryTimes, Int32 retryDelay) System.Windows.Formen.Zwischenablage.SetText(String text, TextDataFormat-format) System.Windows.Formen.Zwischenablage.SetText(String text)
Meine erste Lösung war es, nach einer kurzen pause wiederholen, bis ich merkte, dass die Zwischenablage.SetDataObject Felder für die Anzahl von Zeiten und die Dauer der Verzögerung. .NET das default-Verhalten ist, um zu versuchen 10 mal mit 100 msec Verzögerung.
Gibt es eine Letzte Sache, festgestellt durch den Endbenutzer. Das ist, trotz der Ausnahme, die geworfen wird, der in die Zwischenablage kopieren-Betrieb noch funktioniert. Ich habe nicht in der Lage zu finden, weitere Informationen über warum dies sein mag.
Meine aktuelle Lösung für das Problem einfach stillschweigend zu ignorieren die Ausnahme... ist das wirklich der beste Weg?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als die Zwischenablage wird von allen geteilt-UI-Anwendungen, werden Sie diese von Zeit zu Zeit. Natürlich Sie nicht möchten, dass Ihre Anwendung Abstürzen, wenn es Fehler beim schreiben in die Zwischenablage, so anmutig Umgang ExternalException zumutbar ist. Ich würde vorschlagen, präsentiert einen Fehler an den Benutzer, wenn die SetObjectData Aufruf zum schreiben in die Zwischenablage scheitert.
Vorschlag wäre, die Nutzung (über P/Invoke)
user32!GetOpenClipboardWindow
, um zu sehen, wenn eine andere Anwendung die Zwischenablage öffnen. Es wird wieder die HWND des Fensters, welches die Zwischenablage öffnen, oderIntPtr.Zero
wenn keine Anwendung hatte, es zu öffnen. Sie könnte spin auf den Wert, bis seineIntPtr.Zero
für eine bestimmte Zeit.Ein weiterer workaround wäre die Nutzung von
Clipboard.SetDataObject
stattClipboard.SetText
.Laut in diesem MSDN-Artikel diese Methode hat zwei Parameter, retryTimes und retryDelay -, die Sie verwenden können, wie diese:
Clipboard
- Klasse in der .NET-framework. Eine in derSystem.Windows.Forms
namespace und ein weiteres in derSystem.Windows
namespace (für WPF). Nur das erste hat eine überladung, mit der Anzahl der Wiederholungen und Verzögerungszeit.Lief ich in diese Fehler heute. Ich beschloss, es zu handhaben, indem der Benutzer über die möglicherweise fehlerhafte Anwendung. Um dies tun, können Sie etwas wie das hier tun:
Für mich, das problem Fenster-Titel war "skype_plugin_core_proxy_window". Ich suchte nach Infos, und war überrascht, dass es ergab nur einen Treffer, und das war in Russisch. Also ich bin das hinzufügen dieser Antwort, beide geben weitere Treffer für die Zeichenfolge, und um weitere Hilfe zu bringen, potenziell schadhafte apps zu Licht.
Rufen Sie diese Lösung zuerst:
Bemerkte ich, dass, wenn Sie in der Mitte eine einfügen-operation (WM_PASTE-Nachricht), einschließlich während das TextChanged-Ereignis, das die Zwischenablage gesperrt bleibt, durch das Fenster (Textfeld) Erhalt der Veranstaltung. Also, wenn Sie rufen einfach, dass "CloseClipboard" - Methode innerhalb der event-handler, dann können Sie rufen Sie die Zwischenablage verwaltet.Klar und Zwischenablage.Die SetText-Methoden ohne Probleme oder Verzögerungen.
Durch die Nutzung von Jeff Roe ' s code (Jeff ' s Code)
sind Sie in der Lage, Fehler zu behandeln in einer ziemlich praktisch Weg.
Ich habe es geschafft zu reduzieren, die Häufigkeit der Fehler durch die Verwendung von
System.Windows.Forms.Clipboard
StattSystem.Windows.Clipboard
.Ich betonen, dass dies nicht beheben das problem, aber es reduziert den Eintritt für meine Anwendung.
Tun, eine
Clipboard.Clear()
vorClipboard.SetDataObject(pasteString, true)
scheint, den trick zu tun.Den früheren Vorschlag der Einstellung
retryTimes
undretryDelay
hat bei mir nicht funktioniert und in jedem Fall werden die StandardwerteretryTimes = 10
undretryDelay = 100ms
Dies ist bisschen beschissen... Aber es ist mein problem gelöst.
Wiederholen Sie die clear () - nach einer Verzögerung.
Mehr Informationen im blog-post Wie man mit einem blockierten Zwischenablage - Zwischenablage.Clear () - Fehler.
Habe ich eigentlich kommen mit meiner eigenen Lösung und es scheint zu funktionieren für mich.
Dies ist offensichtlich, C#, jedoch sind diese Verfahren ausgesetzt, um alle Visual Studios. Ich habe offensichtlich erstellt eine looping-Funktion, sowie versucht zu zwingen, es in die Zwischenablage mit Wiederholungen.
Im wesentlichen ist hier die Strömung. Lassen Sie uns sagen, Sie wollen das word-Zwischenablage in der Zwischenablage, überall in Ihrem code (vorausgesetzt, diese Funktion definiert ist).
Ja, das hat auch einen Fehler, wenn Sie wissen, dass die Zwischenablage immer eine Ausnahme, egal was (Endlosschleife). Ich habe jedoch nicht ausgeführt, in eine Endlosschleife mit dieser Methode noch. Der andere Fehler ist, dass es kann ein paar Sekunden dauern (im wesentlichen Verlangsamung von Anwendungen), bevor es funktionieren wird, während es versucht, kann es einfrieren, Ihre Anwendung, sobald es gelingt, die Anwendung wird trotzdem weiter.