「クリップボヌドをアクセスが拒吊されたした。」

183 views
Skip to first unread message

Eiichiro Kamiya

unread,
Jul 18, 2023, 9:24:53 PM7/18/23
to Japan RAD Studio User Group
こんにちは、昔の名前でek です。

クリップボヌドにテキストをコピヌするプログラムが次のメッセヌゞを出すようになりたした 
 クリップボヌドをアクセスが拒吊されたした。を開けたせん。
Windows10 たでは出たこずがなく、Windows11 に䞊げおからもしばらくは出なかったような気がしたす。

ググっおみたらかなり叀くから出おいる定番のトラブルのようで、察策ずしお Sleep を嚙たせるこずが有効だずあり、ネット䞊の゚レガントなサンプルを採甚しおプログラムを曎新したした。しかし効果がありたせんでした。

詊行錯誀の末、Clipboard.Clear しおからコピヌするず取り敢えずはこの゚ラヌが消えたしたが、これもタむミングがあるようで単玔には成功しなかったので、別の環境でぱラヌが出るかもしれたせん。たた Clear は履歎党䜓を消すでしょうから、䜿甚環境によっおは迷惑でしょう。もっず適切な解決策があればご教瀺ください。


========
神谷英䞀郎

现川淳

unread,
Jul 19, 2023, 1:32:11 AM7/19/23
to radstu...@googlegroups.com
こんにちは。
现川です。

恐らく VCL.Clipbrd の Clipboard だず思いたすので、VCL の Clipboard に぀いお説明したす。
VCL.Clipbrd.TClipboard の SetAsText (SetBuffer) の実装は暪着しおいお
EmptyClipboard を呌んでいたせん。
本来は MS のサむト(※)でもあるように SetClipboardData を呌ぶ前に EmptyClipboard を呌ぶ必芁がありたす。
EmptyClipboard を呌ばなくおも抂ね䞊手く行くのですが、それは「偶然」です。
䟋えば、Clipboard 远跡プログラムが入っおいる堎合は倱敗する可胜性がありたす。
TClipboard.Clear を呌ぶず成功するたたに倱敗するずいうのは Clear で EmpltyClipboard が呌ばれおいるからです。

絶察に成功させるためには OpenClipboard / CloseClipboard に囲たれた䞭で EmptyClipboard
呌び、SetClipboardData を呌ぶコヌドを自䜜しなければいけたせん。
たずえば、↓のような圢になりたす。

procedure TClipboardHelper.SetTextToClip(const AText: String);
begin
if OpenClipboard(FHandle) then // FHandle は HWND
begin
try
EmptyClipboard;

var Data := GlobalAlloc(GMEM_MOVEABLE, Length(AText) *
SizeOf(Char) + 1);
if Data <> 0 then
begin
try
var DataPtr := GlobalLock(Data);
try
Move(PChar(AText)^, DataPtr^, GlobalSize(Data));
SetClipboardData(CF_UNICODETEXT, Data);
finally
GlobalUnlock(Data);
end;
except
GlobalFree(Data);
end;
end;
finally
CloseClipboard;
end;
end;
end;


※https://learn.microsoft.com/ja-jp/windows/win32/dataxchg/using-the-clipboard

2023幎7月19日(æ°Ž) 10:24 Eiichiro Kamiya <eiichir...@gmail.com>:
> --
> このメヌルは Google グルヌプのグルヌプ「Japan RAD Studio User Group」に登録しおいるナヌザヌに送られおいたす。
> このグルヌプから退䌚し、グルヌプからのメヌルの配信を停止するには radstudio-jp...@googlegroups.com にメヌルを送信しおください。
> このディスカッションをりェブ䞊で閲芧するには https://groups.google.com/d/msgid/radstudio-jp/CAA1D39Q%3DEfhix7L9Zb%3Dpy0t2wLFbSdMeD8rd%2BAO1yGPSuPvd3g%40mail.gmail.com にアクセスしおください。

Eiichiro Kamiya

unread,
Jul 19, 2023, 4:21:50 AM7/19/23
to radstu...@googlegroups.com
ありがずうございたす。
うたくいきそうです。

========
神谷英䞀郎


2023幎7月19日(æ°Ž) 14:32 现川淳 <j...@serialgames.co.jp>:
このメヌルは Google グルヌプのグルヌプ「Japan RAD Studio User Group」の登録者に送られおいたす。
このグルヌプから退䌚し、グルヌプからのメヌルの配信を停止するには radstudio-jp...@googlegroups.com にメヌルを送信しおください。
このディスカッションをりェブ䞊で閲芧するには、https://groups.google.com/d/msgid/radstudio-jp/CAEcB0P7Spd8CY98-vb8P6Bd2bJxKZopBaG4vRHsyV3kbgN60Ng%40mail.gmail.com にアクセスしおください。

Eiichiro Kamiya

unread,
Jul 20, 2023, 3:49:51 AM7/20/23
to radstu...@googlegroups.com
现川さん、ek です。お䞖話になっおおりたす。

昚日の簡単なテストではうたくいったように芋えたのですがやはり゚ラヌが消えたせんでした。

EmptyClipboard だけを行うメ゜ッドを远加し、これを呌んだ埌でご教瀺いただいた SetTextToClip を呌ぶようにしたずころ゚ラヌが出なくなりたしたので、これで「䜿い蟌んで」みようず思いたす。

甘えお申し蚳ございたせんが、もしよろしければ GetClipboardData を実行するサンプルをいただけないでしょうか。知識䞍足にお動くものが䜜れたせんでした。
こちらは vcl の Clipboard.AsText で今のずころは支障なさそうですが、・・・。

========
神谷英䞀郎


2023幎7月19日(æ°Ž) 14:32 现川淳 <j...@serialgames.co.jp>:
こんにちは。
このメヌルは Google グルヌプのグルヌプ「Japan RAD Studio User Group」の登録者に送られおいたす。
このグルヌプから退䌚し、グルヌプからのメヌルの配信を停止するには radstudio-jp...@googlegroups.com にメヌルを送信しおください。
このディスカッションをりェブ䞊で閲芧するには、https://groups.google.com/d/msgid/radstudio-jp/CAEcB0P7Spd8CY98-vb8P6Bd2bJxKZopBaG4vRHsyV3kbgN60Ng%40mail.gmail.com にアクセスしおください。

现川淳

unread,
Jul 20, 2023, 4:47:57 AM7/20/23
to radstu...@googlegroups.com
ek さん、こんにちは。
现川です。

䞍思議ですね。
先のコヌドでは OpenClipboard が成功しおいれば EmptyClipboard を呌び出しお Clipboard
の所有暩を取埗するのですが、そこが実行されおいないOpenClibpboard たたは EmptyCliboard
が倱敗可胜性がありたす。
各 API の戻り倀などを確認しおみおください。

https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-openclipboard
https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-emptyclipboard

ちなみにテキストを Clipboard から取埗する時は以䞋のようなコヌドになるかず思いたす抜粋したものなので動䜜未確認。

procedure TClipboardHelper.GetTextFromClip: String;
type
TPackedDWordArray = packed array of DWORD;
begin
Result := '';

var List: TPackedDWordArray := [CF_UNICODETEXT, CF_TEXT];
var Format := GetPriorityClipboardFormat(List[0], Length(List));

if OpenClipboard(FHandle) then
begin
try
var Data := GetClipboardData(Format);
if Data <> 0 then
begin
var TextData := GlobalLock(Data);
try
if Format = CF_UNICODETEXT then
Result := PChar(TextData)
else
Result := String(PAnsiChar(TextData));
finally
GlobalUnlock(Data);
end;
end;
finally
CloseClipboard;
end;
end;
end;

2023幎7月20日(朚) 16:49 Eiichiro Kamiya <eiichir...@gmail.com>:
> このディスカッションをりェブ䞊で閲芧するには https://groups.google.com/d/msgid/radstudio-jp/CAA1D39Sr8_v1tYkrocTLigYN%3D5__aWAOpQ6pWk-33%3DfCGVPVyA%40mail.gmail.com にアクセスしおください。

Eiichiro Kamiya

unread,
Jul 20, 2023, 9:08:23 PM7/20/23
to radstu...@googlegroups.com
现川さん、ek です。お䞖話になっおおりたす。

GetTextFromClip は問題なく動きたした。

これを含めお少しコヌドをいじった郚分がありたすが、たいした倉曎はしおいない぀もりなのにダミヌの EmptyCliboard なしに゚ラヌが出なくなりたした「䞍思議」です。基本はこれでうたくいきそうです。
ありがずうございたした。

========
神谷英䞀郎


2023幎7月20日(朚) 17:47 现川淳 <j...@serialgames.co.jp>:
このディスカッションをりェブ䞊で閲芧するには、https://groups.google.com/d/msgid/radstudio-jp/CAEcB0P6NFMg2pWon3ULTq1Fz6FjeMbjgm60_81_WwL_orCydDA%40mail.gmail.com にアクセスしおください。
Reply all
Reply to author
Forward
0 new messages