我想拦截一个外部窗口的wm_paint的事件,我怎样判断事件名称,还有这个事件是从哪个窗发出的。
在线等候!急!急!急!

解决方案 »

  1.   

    使用Message Hook来完成
    不过WM_PAINT是一个过程,要小心使用
    PMsg(Msg)^.hwnd就是消息处理的窗体
      

  2.   

    再请教一下楼上,这种消息是不是一定要在DLL里写呀?
      

  3.   

    下面是最简单的message hook sample
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;
    const
      WM_TestMessage = WM_USER + 2000;
    type
      TForm1 = class(TForm)
        .......
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}
    var
      HookHandle: HHOOK;function TestHookProc(Code: Integer; WParam: Longint;Msg:Longint): Longint;stdcall;
    var
      index: integer;
    begin
        if PMsg(Msg)^.Message = WM_TestMessage then
        begin
        //if PMsg(Msg)^.hwnd = Form1.Handle then
        // add your code here
        end
        else
        begin
          // add your code here
        end;
        end;
        Result := CallNextHookEx(HookHandle, Code, WParam, Longint(@Msg));
    end;
    function SetHook(h:hwnd): boolean;
    beginend;procedure TForm1.FormCreate(Sender: TObject);
    begin
      HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,TestHookProc,0,GetCurrentThreadID);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Postmessage(handle,WM_TestMessage,0,0);
    end;end.
      

  4.   

    这种HOOK只得取本窗口的事件呀。如果是外部窗口就没折了。