まず第一に、これはおそらくアプリケーションの問題ではないことに注意してください。他のアプリケーションがクリップボードをロックしたり、通知チェーンを台無しにしたりして、アプリケーションがクリップボードにアクセスできなくなりました。このような問題が発生した場合は、コンピューターを再起動すると、魔法のように消えてしまいます...まあ...少なくとも、問題を引き起こしているアプリケーションを再度実行するまでは。
このコード(Delphiではチェックされていません)が役立つ場合があります。通知チェーンが壊れているという問題は修正されませんが(PCを再起動する以外は修正されません)、アプリケーションがクリップボードをしばらくロックしている場合は問題が修正されます。その厄介なアプリケーションが本当に長い時間(秒)の間クリップボードをロックしたままにする場合は、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;
また、「raise」を削除して関数に変換し、次のように使用することをお勧めします。
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.');