怎么获取子控件的子控件获得和失去焦点的消息?

qianchuan2010 2012-11-28 01:12:20
比如现有 dtp1: TDateTimePicker;当我选择年份的时候,点击一下年份,会出来个编辑框,我怎么能够获得这个年份编辑框得到焦点和失去焦点的消息?
...全文
313 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
qianchuan2010 2012-12-02
  • 打赏
  • 举报
回复
引用 5 楼 s11ss 的回复:
Delphi/Pascal code?? 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 unit Unit1; interface uses Wi……
非常感谢,我后来也是用钩子做的,用的是WH_CBT
haitao 2012-11-28
  • 打赏
  • 举报
回复
想自己做一个精简的软键盘,发现最好 win能提供所有焦点变换的历史列表 假设我要对 应用a的控件b 进行软键盘输入,则需要把焦点从b移到软键盘程序的按钮c,c的点击事件才能向前一个焦点控件b发送消息 但是,目前好像没有api能 取得前一个焦点控件是谁!
昨天 2012-11-28
  • 打赏
  • 举报
回复
学习一下。。谢谢
s11ss 2012-11-28
  • 打赏
  • 举报
回复
勘误: 把hInstance换成0。
s11ss 2012-11-28
  • 打赏
  • 举报
回复
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.
qianchuan2010 2012-11-28
  • 打赏
  • 举报
回复
引用 3 楼 HSFZXJY 的回复:
那他不是有onenter和onexit事件嘛。。
是windows组件
hsfzxjy 2012-11-28
  • 打赏
  • 举报
回复
那他不是有onenter和onexit事件嘛。。
qianchuan2010 2012-11-28
  • 打赏
  • 举报
回复
引用 1 楼 HSFZXJY 的回复:
如果想在该控件获得或失去焦点时写代码,可以写该控件的oncreate或onexit事件
但是这个控件是系统的,不能操作控件代码
hsfzxjy 2012-11-28
  • 打赏
  • 举报
回复
如果想在该控件获得或失去焦点时写代码,可以写该控件的oncreate或onexit事件

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧