问题表述:当前的窗口里面有1个Edit控件:
1、当前焦点窗口为本程序窗口时,为何不执行WM_SETFOCUS ?
2、当前焦点窗口不为本程序窗口时,为何不执行WM_KILLFOCUS ?
若没有Edit控件,这些代码都可以正常执行,原因出在什么地方,若想让这些消息都能正常执行,我应该将此代码加在何处,请高手帮忙!    
  TForm1 = class(TForm)
    Edit1: TEdit;
  private
    procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
    procedure WMKillFocus(var Message: TWMSetFocus); message WM_KILLFOCUS;
    procedure WndProc(var Msg: TMessage); override;
  end;
implementation
procedure TForm1.WMSetFocus(var Message: TWMSetFocus);
begin
  Caption := Caption + '1';
end;procedure TForm1.WMKillFocus(var Message: TWMSetFocus);
begin
  Caption := Caption + '2';
end;procedure TForm1.WndProc(var Msg: TMessage);
begin
  inherited;  if Msg.Msg = WM_SETFOCUS then
    Caption := Caption + '3'
  else if Msg.Msg = WM_KILLFOCUS then
    Caption := Caption + '4';
end;

解决方案 »

  1.   

    添加一个 WM_ACTIVATE 的消息处理就可以了
      

  2.   

    为什么加了WM_ACTIVATE 就可以呢?
      

  3.   

    见TCustomForm.DefaultHandler里面的处理,如果不处理WM_ACTIVATE消息,则窗口类会调用默认的消息处理方法,这时候WM_SETFOCUS、WM_KILLFOCUS消息窗口就拦不掉了,窗口上具有句柄的类会处理处理这两个消息了。