Delphi 在TMemo、TEdit控件外截获剪贴板粘贴消息

Delphi 在TMemo、TEdit控件外截获剪贴板粘贴消息,delphi,Delphi,我有一个组件,它连接到任何TCustomEdit控件。它过滤到TCustomEdit控件的键盘输入,使该控件的行为类似于maskedit 但我遇到了另一个问题。虽然我可以在粘贴之前分析剪贴板的内容,然后决定是否粘贴(OnKeyDown事件CTRL+V),但我无法通过右键单击菜单捕获粘贴 我不想截获OnChange事件,因为我想在控件的文本实际更改之前执行操作 感谢您的建议以下是操作方法: TTextMask = class (TComponent) private FtempWn

我有一个组件,它连接到任何TCustomEdit控件。它过滤到TCustomEdit控件的键盘输入,使该控件的行为类似于maskedit

但我遇到了另一个问题。虽然我可以在粘贴之前分析剪贴板的内容,然后决定是否粘贴(OnKeyDown事件CTRL+V),但我无法通过右键单击菜单捕获粘贴

我不想截获OnChange事件,因为我想在控件的文本实际更改之前执行操作

感谢您的建议

以下是操作方法:

  TTextMask = class (TComponent)
  private
    FtempWndProc: TWndMethod;
    FWinControl:TWinControl;
    procedure DoWindowProc(var Message: TMessage);
    procedure SetWinControl(Value: TWinControl);
    //...
  published
    //...
    property WinControl : TWinControl read FWinControl write SetWinControl;
  end;

// ...

procedure TTextMask.SetWinControl(Value: TWinControl);
begin
  if Assigned(Value) and  not Assigned(FWincontrol)
      then
            begin
            FtempWndProc := Value.WindowProc;
            Value.WindowProc := DoWindowProc;
            end;
   //...
   FWincontrol:=Value;
end;



procedure TTextMask.DoWindowProc(var Message: TMessage);
var s:string;
    Index:Integer;
    m:integer;
begin
   if Message.Msg = WM_Paste then
     begin
     // code here
     end;
   FtempWndProc(Message);
end;
谢谢你给我一个好建议,大卫。

以下是如何做到这一点:

  TTextMask = class (TComponent)
  private
    FtempWndProc: TWndMethod;
    FWinControl:TWinControl;
    procedure DoWindowProc(var Message: TMessage);
    procedure SetWinControl(Value: TWinControl);
    //...
  published
    //...
    property WinControl : TWinControl read FWinControl write SetWinControl;
  end;

// ...

procedure TTextMask.SetWinControl(Value: TWinControl);
begin
  if Assigned(Value) and  not Assigned(FWincontrol)
      then
            begin
            FtempWndProc := Value.WindowProc;
            Value.WindowProc := DoWindowProc;
            end;
   //...
   FWincontrol:=Value;
end;



procedure TTextMask.DoWindowProc(var Message: TMessage);
var s:string;
    Index:Integer;
    m:integer;
begin
   if Message.Msg = WM_Paste then
     begin
     // code here
     end;
   FtempWndProc(Message);
end;

谢谢你的建议,David。

我想你可以通过监听发送到目标控件的WM_粘贴消息来做你需要做的事情。最简单的方法是通过WindowProc属性替换窗口过程。

我认为您可以通过侦听发送到目标控件的WM_粘贴消息来完成所需的操作。最简单的方法是通过WindowProc属性替换窗口过程。

你能监听WM_粘贴吗?@DavidHeffernan:我想,但如何:-)我不知道如何拦截另一个控件的WM_粘贴。有没有办法在事件到达附加的TCustomEdit控件之前通过此控件传递事件?请替换窗口过程。我想您使用的是WindowProc属性。@DavidHeffernan:Thanx a lot您可以监听WM_粘贴吗?@DavidHeffernan:我想,但是如何:-)我不知道如何拦截另一个控件的WM_粘贴。有没有办法在事件到达附加的TCustomEdit控件之前通过此控件传递事件?请替换窗口过程。我认为您使用了WindowProc属性。@DavidHeffernan:Thanx一个lot在您的组件或其实例存储在
fInControl
字段中的组件被销毁之前,您必须还原原始窗口过程。您必须在您的组件或其实例被销毁的组件之前还原原始窗口过程存储在
fInControl智能驭享
字段中的信息被销毁。