Comment puis-je résoudre « ne peut pas ouvrir le presse-papiers: Accès refusé » des erreurs?

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

Question

Je suis en utilisant le code suivant pour copier du texte dans le presse-papiers:

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

apparemment au hasard je reçois « Impossible d'ouvrir le presse-papiers: Accès refusé » erreurs. Je devine que ces erreurs sont causées par une autre application de verrouillage du presse-papiers, mais je ne semblent jamais être faire quoi que ce soit avec d'autres applications qui doivent faire en sorte que les serrures.

Bizarrement mes utilisateurs semblent avoir des rapports plus des erreurs avec Vista et Windows 7 que sous XP.

Yat-il un moyen de vérifier si le presse-papiers est verrouillé avant de tenter d'y accéder?

Était-ce utile?

La solution

Ce n'est pas un problème Delphi. Parce que le presse-papier peut être verrouillé tout moment, même si vous vérifiez, si le presse-papiers est actuellement pas verrouillé, il peut devenir verrouillé directement après le contrôle.

Vous avez deux possibilités:

  1. Ne pas utiliser la classe de presse-papiers Delphi. Au lieu d'utiliser les fonctions API premières, où vous avez un peu plus de contrôle fin sur des situations d'erreur possibles.
  2. Attendez-vous à votre code à l'échec en ajoutant un gestionnaire d'exception. Ensuite, ajoutez un code de nouvelle tentative, à savoir nouvelles tentatives pour définir le texte trois fois, peut-être avec backoff exponentielle, avant de lancer votre propre erreur.

Je recommande la deuxième solution, car il serait plus approche comme Delphi et à la fin se traduira par un code plus propre.

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;

Autres conseils

  

Bizarrement mes utilisateurs semblent être   rapports plus des erreurs avec   Vista et Windows 7 que sous XP

Cela peut avoir à faire avec la façon dont traiter Vista / Windows 7 avec notification de visionneuse de presse-papiers. Alors qu'ils soutiennent toujours le XP « chaîne de visionneuse de presse-papiers », qui envoie un message de notification qui doit être ré-envoyé à chaque auditeur à son tour (et si une application ne parvient pas à le faire, les autres applications ne sont pas notifiés). A partir de Vista, les applications sont informés directement. Et il n'y a rien pour les empêcher d'essayer d'accéder au presse-papiers à la fois.

Analogie: J'ai 3 enfants. J'ai un gâteau. Avec des règles XP, je dis l'enfant le plus âgé d'avoir un gâteau, puis dire le prochain enfant le plus âgé d'une tranche. Elle obtient sa tranche, dit son frère, il obtient son, et dit à son frère, qui reprend, et tout se déroule de façon ordonnée.
Problème:. L'enfant du milieu prend le gâteau dans sa chambre, ne dit pas le plus jeune, et les plus jeunes sur misses

Avec Vista / Windows7, ce système existe toujours. Mais les applications plus récentes peuvent demander à être informé immédiatement, par moi, dès que le gâteau arrive dans la cuisine. Je crie « gâteau est prêt! » et ils présentent tous en même temps et essayer de récupérer un peu. Mais il n'y a qu'un seul couteau de service, de sorte qu'ils doivent continuer d'atteindre le couteau, à défaut de le faire, et d'attendre la prochaine occasion.

Il n'y a aucun moyen de vérifier quelque chose, puis en fonction du résultat faire quelque chose d'autre avec l'espoir que cela ne pouvait manquer, car à moins que le contrôle et l'action sont une seule opération atomique il y a toujours la possibilité qu'un autre processus ou thread fait la même chose en parallèle.

Cela est si vous essayez d'ouvrir le presse-papiers, ouvrez un fichier, créer ou supprimer un répertoire - vous devriez simplement essayer de le faire, peut-être plusieurs fois dans une boucle, et avec élégance gérer les erreurs

.

Essayez de vérifier GetClipboardOwner, si ce n'est pas nulle et non votre Application.Handle, vous ne pouvez pas ouvrir de modifier son contenu.
Et même il semble bien aller, il pourrait ne pas être plus quand vous faites réellement.
Alors ajoutez un essai, sauf dans une boucle jusqu'à ce que vous ou renoncez bien (informer l'utilisateur par exemple).

D'abord s'il vous plaît noter que ceci est probablement pas un problème dans votre application. D'autres applications verrouillées le presse-papiers ou foiré la chaîne de notification et maintenant votre application ne parvient pas à accéder. Lorsque j'ai des problèmes comme cela, je redémarrez l'ordinateur et ils vont comme par magie ... eh bien ... au moins jusqu'à ce que je lance à nouveau l'application qui crée le problème.

Ce code (non vérifié dans Delphi) peut vous aider. Il ne résoudra pas le problème de la chaîne de notification est rompue (rien, sauf un redémarrage du PC ne sera jamais corriger) mais il va résoudre le problème si une application verrouille le presse-papiers pendant un certain temps. Augmenter les MaxRetries si cette application satanés maintient le presse-papier verrouillé pour un temps très long (secondes):

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;

En outre, il peut être une bonne idée de laisser tomber la « relance » et le convertir en une fonction et l'utiliser comme ceci:

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.');

Je suppose que vous exécutez votre application sur Windows 8 ou plus.

Juste un clic droit sur votre fichier .exe App, allez à l'onglet Compatibilité et le mode de compatibilité de changement sous Windows XP ou des versions inférieures. Ça va marcher, garanti!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top