Wie kann ich reparieren „kann nicht geöffnet werden Zwischenablage: Zugriff verweigert“ Fehlermeldung?

StackOverflow https://stackoverflow.com/questions/1859102

Frage

Ich bin mit dem folgenden Code ein Text in die Zwischenablage kopieren:

  Clipboard.Open;
  try
    Clipboard.AsText := GenerateClipboardText;
  finally
    Clipboard.Close;
  end;

Scheinbar zufällig ich „kann nicht geöffnet werden Zwischenablage: Zugriff verweigert“ -Fehler. Ich vermute, dass diese Fehler durch andere Anwendung Sperren der Zwischenablage verursacht werden, aber ich glaube, nie etwas zu tun mit anderen Anwendungen, die die Sperren führen sollten.

Seltsam scheinen meine Nutzer mehr der Fehler mit Vista und Windows 7 als mit XP zu berichten.

Gibt es eine Möglichkeit zu überprüfen, ob die Zwischenablage, bevor Sie versuchen gesperrt ist, darauf zuzugreifen?

War es hilfreich?

Lösung

Dies ist kein Delphi Problem. Da kann die Zwischenablage jeden Moment gesperrt werden, auch wenn Sie überprüfen, ob die Zwischenablage zur Zeit nicht gesperrt ist, kann es direkt nach dem Check worden gesperrt.

Sie haben zwei Möglichkeiten:

  1. Verwenden Sie die Delphi-Zwischenablage Klasse nicht. Stattdessen roh API-Funktionen verwenden, wo Sie ein wenig mehr feinkörnige Kontrolle über mögliche Fehlersituationen haben.
  2. Erwarten Sie Ihren Code durch Hinzufügen eines Exception-Handler zum Scheitern verurteilt. Dann fügen Sie einige Wiederholungs Code, das heißt wiederholen Sie den Text dreimal zu setzen, vielleicht mit exponentiellem Backoff, bevor Sie Ihre eigenen Fehler zu werfen.

Ich würde die zweite Lösung empfehlen, weil es der mehr Delphi-ähnliche Ansatz würde und am Ende wird in saubereren Code zur Folge hat.

while not Success do
try
  //Set the clipboard
  Success := True;
except
  on Exception do
  begin
    Inc(RetryCount);
    if RetryCount < 3 then 
      Sleep(RetryCount * 100)
    else 
      raise MyException.Create('Cannot set clipboard');
  end;
end;

Andere Tipps

  

Seltsamer meine Nutzer zu sein scheinen   mehr der Meldung von Fehlern mit   Vista und Windows 7 als mit XP

Dies kann mit Zwischenablage-Viewer-Benachrichtigung mit, wie Vista / Win7 umgehen zu tun hat. Während sie noch die XP „Zwischenablage-Viewer-Kette“ unterstützen, die eine Benachrichtigungsnachricht sendet, die jeden Zuhörer wiederum erneut gesendet werden muß (und wenn eine App dies nicht, so werden die anderen Anwendungen nicht gemeldet). Beginnend mit Vista werden Anwendungen direkt benachrichtigt. Und es gibt nichts, damit sie nicht versuchen, die Zwischenablage auf einmal zugreifen.

Analogie: Ich habe 3 Kinder. Ich habe einen Kuchen. Mit XP Regeln sagen, dass ich das älteste Kind etwas Kuchen zu haben, sagen dann die nächste älteste Kind ein Stück zu haben. Sie bekommt ihre Scheibe, sagt ihr Bruder, er bekommt seine und erzählt seinem Bruder, der seine bekommt, und alles läuft in einer geordneten Art und Weise.
Problem:. Das mittlere Kind des Kuchen in sein Zimmer nimmt, sagt nicht der Jüngste, und die jüngsten Fehlschläge aus

Mit Vista / Windows7, dass das System immer noch existiert. Aber neuere Anwendungen können verlangen, sofort benachrichtigt werden, von mir, sobald der Kuchen in der Küche kommt. Rufe ich „Kuchen ist fertig!“ und sie alle zeigen, die gleichzeitig und versuchen, einige zu greifen. Aber es gibt nur ein Messer dient, so dass sie halten für das Messer zu erreichen, andernfalls es zu bekommen, und auf die nächste Gelegenheit warten.

Es gibt keine Möglichkeit für etwas zu überprüfen und dann auf das Ergebnis je etwas anderes tun, mit der Erwartung, dass es nicht scheitern könnte, weil es sei denn, die Überprüfung und die Aktion sind eine atomare Operation die Möglichkeit besteht immer, dass ein anderer Prozess oder Thread macht das gleiche in parallel.

Dies gilt, ob Sie versuchen, die Zwischenablage zu öffnen, eine Datei öffnen, erstellen oder ein Verzeichnis löschen - Sie sollten einfach versuchen, es zu tun, vielleicht mehrmals in einer Schleife, und anmutig Fehler behandeln

.

Versuchen GetClipboardOwner zu überprüfen, wenn es nicht null ist und nicht Ihre Application.Handle, können Sie nicht öffnen, es ist Inhalt zu ändern.
Und selbst scheint es gut zu gehen, ist es nicht mehr sein könnte, wenn Sie es wirklich tun.
So fügen Sie einen Versuch, außer in einer Schleife, bis Sie es oder schön aufgeben (die Benutzer beispielsweise Benachrichtigung).

Zu allererst beachten Sie bitte, dass dies wahrscheinlich kein Problem in der Anwendung ist. Andere Anwendungen, verschloss die Zwischenablage oder verwirrten die Benachrichtigungskette und jetzt Ihre Anwendung nicht darauf zugreifen. Wenn ich Sie Probleme wie diese neu starten ich den Computer, und sie gehen auf magische Weise weg ... na ja ... zumindest, bis ich wieder die Anwendung ausführen, die das Problem verursacht.

Dieser Code (nicht in Delphi geprüft) können Ihnen helfen. Es wird nicht das Problem beheben ist die Benachrichtigungskette (nichts außer einem PC Neustart wird es immer fix) gebrochen wird, aber es wird das Problem zu beheben, wenn eine Anwendung für eine Weile die Zwischenablage blockiert. Erhöhen Sie die MaxRetries wenn die nervtötende Anwendung über die Zwischenablage für eine wirklich lange Zeit (Sekunden) gesperrt hält:

procedure Str2Clipboard(CONST Str: string; iDelayMs: integer);
CONST
   MaxRetries= 5;
VAR RetryCount: Integer;
begin
 RetryCount:= 0;
 for RetryCount:= 1 to MaxRetries DO
  TRY
    inc(RetryCount);
    Clipboard.AsText:= Str;
    Break;
  EXCEPT
    on Exception DO
      if RetryCount = MaxRetries
      then RAISE Exception.Create('Cannot set clipboard')
      else Sleep(iDelayMs)
  END;
end;

Auch kann es eine gute Idee, die ‚Erhöhung‘ fallen zu lassen und es in eine Funktion umwandeln und es wie folgt verwendet werden:

if not Str2Clipboard 
then Log.AddMsg('Dear user, other applications are blocking the clipboard. We have tried. We really did. But it didn''t work. Try again in a few seconds.');

Ich denke, Sie laufen Ihre App auf Win 8 oder höher.

Einfach mit der rechten Maustaste auf Ihre App Exe-Datei, gehen Sie zu Registerkarte Kompatibilität und Wechsel-Kompatibilitätsmodus auf Windows XP oder niedrigere Versionen. Es wird funktionieren, garantiert!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top