Как запретить другим программам отслеживать измененный буфер обмена
Мне нужно временно запретить другим программам отслеживать изменения, внесенные в буфер обмена, прерывая цепочку сообщений буфера обмена. Как это можно сделать в Дельфах?
Я нашел этот код, который должен был сделать трюк, но он этого не делает (в Win 10 Ent x64). Есть ли в этом коде какая-то ошибка, которую можно исправить?
Файл pas следующим образом:
(* --------------------------------------------------------------- { TAntiClipboardLogging } Generates OnClipboardChange event when contents of clipboard changes. Property PreventClipboardLogging to toggle ClipboardLogging on or off. Sample code usage: ================== private { Private declarations } FBlocker: TAntiClipboardLogging; // for anti-Clipboard logging procedure TFormMain.StartAntiClipboardLoggingProc; begin // start anti-Clipboard logging FBlocker := TAntiClipboardLogging.Create; FBlocker.PreventClipboardLogging := True; Application.ProcessMessages; end; procedure TFormMain.StopAntiClipboardLoggingProc; begin // stop anti-Clipboard logging FBlocker.PreventClipboardLogging := False; FBlocker.Free; Application.ProcessMessages; Sleep(100); // e.g. if clearing Clipboard afterwards end; ---------------------------------------------------------------- *) unit AntiClipboardLogging; interface uses Windows, Messages, Classes; type TClipboardChangeEvent = TNotifyEvent; { TClipboardActivityMonitor } TClipboardActivityMonitor = class(TPersistent) private FMonitorWindow: THandle; FNextWindow: THandle; FPreventClipboardLogging: Boolean; FOnClipboardChange: TClipboardChangeEvent; procedure PassMessage(Message: TMessage); procedure SetPreventClipboardLogging(const Value: Boolean); protected procedure DoClipboardChange; virtual; procedure WndProc(var Message: TMessage); virtual; property OnClipboardChange: TClipboardChangeEvent read FOnClipboardChange write FOnClipboardChange; public constructor Create; virtual; destructor Destroy; override; property PreventClipboardLogging: Boolean read FPreventClipboardLogging write SetPreventClipboardLogging; end; TAntiClipboardLogging = class(TClipboardActivityMonitor) published property OnClipboardChange; property PreventClipboardLogging; end; implementation uses Forms; { TClipboardActivityMonitor } constructor TClipboardActivityMonitor.Create; begin FPreventClipboardLogging := False; end; destructor TClipboardActivityMonitor.Destroy; begin SetPreventClipboardLogging(False); inherited; end; procedure TClipboardActivityMonitor.DoClipboardChange; begin if Assigned(FOnClipboardChange) then FOnClipboardChange(Self); end; procedure TClipboardActivityMonitor.PassMessage(Message: TMessage); begin SendMessage(FNextWindow, Message.Msg, Message.WParam, Message.LParam); end; procedure TClipboardActivityMonitor.SetPreventClipboardLogging(const Value: Boolean); begin if FPreventClipboardLogging = Value then Exit; if Value then begin FMonitorWindow := AllocateHWnd(WndProc); FNextWindow := SetClipBoardViewer(FMonitorWindow); end else begin ChangeClipboardChain(FMonitorWindow, FNextWindow); DeallocateHWnd(FMonitorWindow); end; FPreventClipboardLogging := Value; end; procedure TClipboardActivityMonitor.WndProc(var Message: TMessage); begin if Message.Msg = WM_DRAWCLIPBOARD then begin // This Message is also triggered when starting // or stopping to monitor // In these cases Clipboard.FormatCount will always // return 0 (??) try DoClipboardChange; finally // PassMessage(Message); // Remove this line to break chain end; end; //wParam = HWNDRemove //lParam = HWNDNext if Message.Msg = WM_CHANGECBCHAIN then begin // If next window is the one to be removed, LParam is // the new NextWindow. // Else pass the message to our NextWindow if FNextWindow = Cardinal(Message.WParam) then FNextWindow := Cardinal(Message.LParam) else PassMessage(Message); end; with Message do Result := DefWindowProc(FMonitorWindow, Msg, wParam, lParam); end; end.
Что я уже пробовал:
Приведенный выше код, но он не работает.