如何拦截(检测)粘贴命令到TMemo?

Srd*_*ica 7 delphi paste detect memo intercept

如何在将文本粘贴到TMemo之前捕获粘贴命令并更改剪贴板的文本,但是,粘贴后,剪贴板中的文本必须与更改之前相同?

例如,剪贴板上有文字'简单问题',TMemo中的文字是'СимплeQуeстиoн',之后剪贴板中的文字就像更改之前的'简单问题'.

Ser*_*yuz 15

派生一个从'TMemo'下降的新控件来拦截WM_PASTE消息:

type
  TPastelessMemo = class(TMemo)
  protected
    procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
  end;

uses
  clipbrd;

procedure TPastelessMemo.WMPaste(var Message: TWMPaste);
var
  SaveClipboard: string;
begin
  SaveClipboard := Clipboard.AsText;
  Clipboard.AsText := 'Simple Question';
  inherited;
  Clipboard.AsText := SaveClipboard;
end;
Run Code Online (Sandbox Code Playgroud)

如果您想要禁止任何粘贴操作,请清空WMPaste处理程序.


Ala*_*inD 7

这是 Sertac 优秀答案的替代方案,即覆盖控件的 WndProc:

// For detecting WM_PASTE messages on the control
OriginalMemoWindowProc: TWndMethod;
procedure NewMemoWindowProc(var Message: TMessage);
//...

// In the form's OnCreate procedure:
// Hijack the control's WindowProc in order to detect WM_PASTE messages
OriginalMemoWindowProc := myMemo.WindowProc;
myMemo.WindowProc := NewMemoWindowProc;
//...

procedure TfrmMyForm.NewMemoWindowProc(var Message: TMessage);
var
    bProcessMessage: Boolean;
begin
    bProcessMessage := True;
    if (Message.Msg = WM_PASTE) then
        begin
        // Data pasted into the memo!
        if (SomeCondition) then
            bProcessMessage := False;   // Do not process this message any further!
        end;

    if (bProcessMessage) then
        begin
        // Ensure all (valid) messages are handled!
        OriginalMemoWindowProc(Message);
        end;
end;
Run Code Online (Sandbox Code Playgroud)