2012-04-15 65 views
7

如何在將文本粘貼到TMemo之前捕捉粘貼命令並更改剪貼板文本,但粘貼後,剪貼板中的文本必須與更改前相同?如何攔截(檢測)粘貼命令到TMemo中?

例如,剪貼板上有'Simple Question'文本,TMemo中的文本是'СимплeQуeстиoн',之後剪貼板中的文本就像在更改'簡單問題'之前一樣。

回答

13

派生出新的控制從「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; 

如果你想禁止任何粘貼操作可言,空WMPaste處理程序。

+0

感謝@Ken,我誤解了問題。 – 2012-04-15 01:56:31

+0

:)我認爲你已經釘了它。 +1,並刪除我的評論。 – 2012-04-15 02:03:24

3

這是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;