RT,我希望的就是当剪贴板里面有汉字的时候,粘贴效果无效。能不能帮忙给断代码,谢谢。

解决方案 »

  1.   

    除非你继承Edit重写里面的消息函数来进行过滤,否则似乎只能在FORM的WndProc里面进行处理。判断下消息的HANDLE是不是EDIT的HANDLE,然后对特定消息进行处理(如丢弃)。
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,Clipbrd, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      procedure NewWndProc(var Message: TMessage);
      end;var
      Form1: TForm1;
      OldWndProc:TWndMethod;
    implementation{$R *.dfm}{ TForm1 }procedure TForm1.NewWndProc(var Message: TMessage);
    var
    str:string;
    i:Integer;
    begin
      if Message.Msg=WM_PASTE then
      begin
        str:=clipboard.AsText;
        for i:=1 to Length(str)-1 do
        begin
          if Ord(str[i])>128 then
          begin
            Message.Msg:=0;
            Break;
          end;
        end;
      end;
      OldWndProc(Message);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      OldWndProc:=Edit1.WindowProc;
      Edit1.WindowProc:=NewWndProc;
    end;end.写的不好,你可以参考下
      

  3.   

    楼上不要写个新函数出来,直接覆盖WndProc就行
      

  4.   

    Edit中的粘贴时不会触发WM_PASTE消息的
      

  5.   

    假如你需要重装WndProc来拦截消息的话,参考下面unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,WinSock, StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
      private
        { Private declarations }
        procedure WndProc(var msg:TMessage);override;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}
    { TForm1 }procedure TForm1.WndProc(var msg: TMessage);
    begin
      if msg.Msg =  WM_PASTE then
        ShowMessage('ok');
      inherited;
    end;end.
      

  6.   

    下面的可以unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs,WinSock, StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
        procedure EditWndProc(var Message: TMessage);
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      EditHandle: THandle;
      EditPointer:Pointer;implementation{$R *.dfm}
    { TForm1 }
    { TForm1 }procedure TForm1.EditWndProc(var Message: TMessage);
    begin
      case Message.Msg of
          WM_PASTE : ShowMessage('ok'); //这里可以做你要做的事情
       end;
       Message.Result:=CallWindowProc(EditPointer, EditHandle, Message.Msg, Message.WParam, Message.LParam);
    end;procedure TForm1.FormCreate(Sender: TObject);
    Var P:Pointer;
    begin
      EditHandle:=Edit1.Handle;
      if EditHandle<>0 then
      begin
        EditPointer := Pointer(GetWindowLong(EditHandle, GWL_WNDPROC));
        P := Classes.MakeObjectInstance(EditWndProc);
        SetWindowLong(EditHandle, GWL_WNDPROC, Longint(P));
      end;
    end;end.
      

  7.   

    怎么OK show 不出来?按道理是不是CTRL+V就会出来的?
      

  8.   

      放个popmenue 内容为空 设置edit popmenue为它就可以了吧
      

  9.   

    bdmh,下面的代码在粘贴之前可以实现些时间? 但是最后还是把剪贴板上的字符粘贴上去了?
    有什么办法能不做粘贴工程么?
      

  10.   

    你要做处理呀,我那只是show一个信息而已,你Exit试试