如何获取子控件的子控件获得和失去焦点的消息

怎么获取子控件的子控件获得和失去焦点的消息?
比如现有 dtp1: TDateTimePicker;当我选择年份的时候,点击一下年份,会出来个编辑框,我怎么能够获得这个年份编辑框得到焦点和失去焦点的消息?
------解决方案--------------------
如果想在该控件获得或失去焦点时写代码,可以写该控件的oncreate或onexit事件
------解决方案--------------------
那他不是有onenter和onexit事件嘛。。
------解决方案--------------------
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    dtp1: TDateTimePicker;
    procedure dtp1DropDown(Sender: TObject);
    procedure dtp1CloseUp(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses CommCtrl;

{$R *.dfm}

var
  g_hHook: HHOOK;

function CallWndProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT stdcall;
  function IsYearEdit(h: hwnd): Boolean;
  var
    b: array[0..255] of Char;
  begin
    Result := False;
    GetClassName(h, b, 256);
    if b <> 'Edit' then Exit;
    Result := GetParent(h) = DateTime_GetMonthCal(Form1.dtp1.Handle);
  end;
begin
  if code = HC_ACTION then
  begin
    Result := 0;
    if PCWPStruct(lParam)^.message = WM_SETFOCUS then
    begin
      if IsYearEdit(PCWPStruct(lParam)^.hwnd) then
      begin
        Form1.Text := '获得焦点'
      end
    end
    else if PCWPStruct(lParam)^.message = WM_KILLFOCUS then
      if IsYearEdit(PCWPStruct(lParam)^.hwnd) then
      begin
        Form1.Text := '失去焦点'
      end
  end else
    Result := CallNextHookEx(g_hHook, code, wParam, lParam)
end;

procedure TForm1.dtp1DropDown(Sender: TObject);
begin//dtp1的OnDropDown事件
  g_hHook := SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, hInstance, GetCurrentThreadId)
end;

procedure TForm1.dtp1CloseUp(Sender: TObject);
begin//dtp1的OnCloseUp事件
  UnhookWindowsHookEx(g_hHook)
end;

end.

------解决方案--------------------
学习一下。。谢谢
------解决方案--------------------
想自己做一个精简的软键盘,发现最好 win能提供所有焦点变换的历史列表

假设我要对 应用a的控件b 进行软键盘输入,则需要把焦点从b移到软键盘程序的按钮c,c的点击事件才能向前一个焦点控件b发送消息
但是,目前好像没有api能 取得前一个焦点控件是谁!