我想在控件失去焦点时执行一段代码,可是找不到WM_KILLFOCUS消息的处理函数,ONEXIT是不行的,用ApplicationEvents1也不行,该怎么办呀

解决方案 »

  1.   

    你先要确定控件能否得到焦点,一般要在Click中写上SetFocus
      

  2.   

    线程的消息都要经过Application.OnMessage处理。楼主说ApplicationEvents很不负责任
      

  3.   

    Hook
    --------------------------------
    //回调函数
    function HookProc(h: hwnd; uMsg: UINT; wP: WParam; lP: lParam): LRESULT; stdcall;
    label l;
    var
      frm: TForm1;
    begin
      frm := TForm1(GetWindowLong(h, GWL_USERDATA));
      //这里写你要处理的东西,其他可以查windows消息
      case uMsg of
       WM_KILLFOCUS:;
      else begin
          l: Result := CallWindowProc(frm.FOldPro, h, uMsg, wP, lP);
          Exit;
        end;
      end;
      Result := 1;
    end;//这段函数在OnCreate调用
    procedure TForm1.HookPanel();
    var
      h: hwnd;
      l: LongInt; //l2
    begin
      h:=panel1.Handle;
      l := GetWindowLong(h, GWL_WNDPROC);
      FOldPro := Pointer(l);
      SetWindowLong(h, GWL_USERDATA, Integer(Self));
      if l <> 0 then
        SetWindowLong(h, GWL_WNDPROC, Integer(@HookProc));
    end; 
      

  4.   

    if Edit1.Focused := false then
      begin
        //事件代码
      end;
      

  5.   

    szuzsq :FOldPro 是什么啊
    这段代码写在哪啊?
    if Edit1.Focused := false then 
      begin 
        //事件代码 
      end;
      

  6.   

    FOldPro := Pointer(l); EDIT1也是个窗口---你改改就是了不是你上面那么写的
      

  7.   

    FOldPro:Pointer;
    TForm1成员变量