Прежде всего, обратите внимание, что это, вероятно, не проблема в вашем приложении. Другие приложения заблокировали буфер обмена или испортили цепочку уведомлений, и теперь ваше приложение не может получить к нему доступ. Когда у меня возникают подобные проблемы, я перезагружаю компьютер, и они волшебным образом исчезают ... ну ... по крайней мере, пока я снова не запустите приложение, которое создает проблему.
Этот код (не проверенный в Delphi) может вам помочь. Это не решит проблему, если нарушена цепочка уведомлений (ничего, кроме перезапуска ПК, это не исправит), но это исправит проблему, если какое-то время приложение блокирует буфер обмена. Увеличьте MaxRetries, если это противное приложение удерживает буфер обмена заблокированным в течение ДЕЙСТВИТЕЛЬНО ДОЛГОГО времени (в секундах):
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;
Кроме того, было бы неплохо отбросить «рейз» и преобразовать его в функцию и использовать ее следующим образом:
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.');