掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
クリップボードの監視でテキストを取得すると「アクセスが拒否されました」と表示される (ID:150608)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
何種類か試しました。 「玉石混淆みんなで作るSample蔵」にあるサンプルで WmDrawClipboardの処理を 下記の様に再入防止処理を追加するとエラーが出なくなります。 procedure TFormMain.WmDrawClipboard(var msg: TWmDrawClipboard); var Tmp:string; begin SendMessage(hNext, WM_DRAWCLIPBOARD, 0, 0); if Clipboard.HasFormat(CF_TEXT) then Tmp:= ClipBoard.AsText else Exit; if FBusy then exit; FBusy := True; ListBox1.Items.Add(Tmp); FBusy := False; end; 次に質問したとき、専用のクラスにしたときの WndProcの処理に同じように再入防止をしてもエラーが出ます。 procedure TClipboardEx.WndProc(var Msg: TMessage); var MsgC : TWMChangeCBChain; begin if (Msg.Msg = WM_DRAWCLIPBOARD) then begin SendMessage(FHandleNext, WM_DRAWCLIPBOARD, 0, 0); if FBusy then exit; FBusy := True; DoChangeText(); FBusy := False; end else if (Msg.Msg = WM_CHANGECBCHAIN) then begin MsgC := TWMChangeCBChain(Msg); if MsgC.Remove = FHandleNext then FHandleNext:= MsgC.Next; SendMessage(FHandleNext, WM_CHANGECBCHAIN, MsgC.Remove, MsgC.Next); Msg.Result := 0; end; //Msg.Result := DefWindowProc(FHandleNext,Msg.Msg,Msg.wParam, Msg.lParam); end; ハンドルを独自に作るのがダメなのかとTWinControlから継承して作っても エラーが出ます。 色々試していますが、別の現象が発生するようなので悩むぐらいならsleep(10)を使うのが最適なのかも なんか しっくりきませんね。 (一度クリップボード関係のメッセージを受けて、メッセージが来なくなってから処理するとか?) type TClipboardEx2 = class(TWinControl) private FHandleNext : HWND; FBusy : Boolean; FOnChangeText: TNotifyEvent; function GetText: string; procedure WmDrawClipboard(var msg: TWmDrawClipboard); Message WM_DRAWCLIPBOARD; procedure WmChangeCBChain(var mes: TWmChangeCBChain); Message WM_CHANGECBCHAIN; protected procedure DoChangeText(); public { Public 宣言 } // 監視開始 procedure Open(); // 監視終了 procedure Close(); property Text : string read GetText; published property OnChangeText : TNotifyEvent read FOnChangeText write FOnChangeText; end; procedure TClipboardEx2.Open; begin FHandleNext := SetClipboardViewer(Handle); end; procedure TClipboardEx2.Close; begin ChangeClipboardChain(Handle, FHandleNext); end; procedure TClipboardEx2.DoChangeText; begin if Assigned(FOnChangeText) then begin FOnChangeText(Self); end; end; function TClipboardEx2.GetText: string; var MyHandle : THandle; begin ClipBoard.Open; MyHandle := Clipboard.GetAsHandle(CF_TEXT); try result := Clipboard.AsText; finally GlobalUnlock(MyHandle); end; Clipboard.Close; end; procedure TClipboardEx2.WmChangeCBChain(var mes: TWmChangeCBChain); begin if mes.Remove = FHandleNext then FHandleNext:= mes.Next; SendMessage(FHandleNext, WM_CHANGECBCHAIN, mes.Remove, mes.Next); mes.Result:= 0; end; procedure TClipboardEx2.WmDrawClipboard(var msg: TWmDrawClipboard); begin SendMessage(FHandleNext, WM_DRAWCLIPBOARD, 0, 0); //sleep(1); if Clipboard.HasFormat(CF_TEXT) then begin if FBusy then exit; FBusy := True; DoChangeText; FBusy := False; end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.