如何取得上一个获得焦点控件的句柄?

lliihhaaoo 2001-09-14 11:02:32
比如说我在一个应用程序里点击了其中一个Memo控件,然后又点击了自己程序里的一个btn,这时我想在这个btn的onclick事件里获得那个memo控件的句柄或相关信息,咋办?
...全文
479 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dedema 2001-10-13
  • 打赏
  • 举报
回复
用findwindowex凼数.
baifeng 2001-10-13
  • 打赏
  • 举报
回复
var
hd:thandle;
buf:array[1..50] of char;
begin
hd:=findwindow(nil,'别的应用程序标题')
hd:=findwindowex(hd,0,'edit',nil); //EDIT的句柄 用SPY++查看类名及,,,
end;


lliihhaaoo 2001-09-28
  • 打赏
  • 举报
回复
up
lliihhaaoo 2001-09-27
  • 打赏
  • 举报
回复
up
lliihhaaoo 2001-09-19
  • 打赏
  • 举报
回复
你怎么知道何时所有控件失去焦点(不用Hook)?
telstar 2001-09-18
  • 打赏
  • 举报
回复
不用那么麻烦,定义一个指针变量,当所有控件失去焦点时,让该指针指向他自己不就得了?
lliihhaaoo 2001-09-18
  • 打赏
  • 举报
回复
我想在Screen.OnActiveControlChange里获得,但是他好象只管自己程序里的事,顾不得全局啊
lliihhaaoo 2001-09-15
  • 打赏
  • 举报
回复
将FocusHandle保存?拦截这个消息是吗?似乎可行,试试!
zxb2001 2001-09-15
  • 打赏
  • 举报
回复
gz
dengzhen 2001-09-15
  • 打赏
  • 举报
回复
如果不用hotkey,也可以用Hook来实现。
lliihhaaoo 2001-09-14
  • 打赏
  • 举报
回复
都不是啦!假如我在IE的地址栏点了一下,然后又跑大老远到我自己的程序了点了一下,这时怎样获得IE地址栏的Handle?
liaokuo 2001-09-14
  • 打赏
  • 举报
回复
在构件的mousemove事件里记录
看看哪个时间更晚
copy_paste 2001-09-14
  • 打赏
  • 举报
回复
不行,我不知其它方法了。
铛铛爸爸 2001-09-14
  • 打赏
  • 举报
回复
gz
copy_paste 2001-09-14
  • 打赏
  • 举报
回复
你可以将FocusHandle保存,然后按Button时,拿保存的Handle来用就是了。
lliihhaaoo 2001-09-14
  • 打赏
  • 举报
回复
to copy_paste(木石三):
我不是用hotkey啊,我就是想在焦点已经变化的情况下得到上一个焦点。
wisonye 2001-09-14
  • 打赏
  • 举报
回复
要取一个获得焦点control的handle的方法如下:
(1)用GetCursorPos()涵数取得当前mouse所在的屏幕坐标
(2)用WindowFromPoint()涵数(参数是上面得到的坐标值)来返回这个window的Handle:)
copy_paste 2001-09-14
  • 打赏
  • 举报
回复
var
Buffer: PChar;
...
begin
...
SendMessage(FocusHandle, WM_GetText, 255, Integer(Buffer));
Memo1.Lines.Add(Format('焦点控件的Handle: %d, Text:%s', [FocusHandle, Buffer]));
...
end;
copy_paste 2001-09-14
  • 打赏
  • 举报
回复
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle, 1001, MOD_Win, 65); //注册全局热键"Win + A"
end;
proceudre TForm.OnClose;
begin
UnRegisterHotKey(Handle, 1001);
end;

{消息重载 WM_HOTKEY}
procedure TForm1.WMHotKey(var Msg: TMessage);
var
ActiveHandle: THandle; //当前活动窗体ThreadID
FocusHandle: THandle; //焦点控件
CurHandle: THandle; //本程序ThreadID
begin
if Msg.WParam = 1001 then //
begin
CurHandle := GetCurrentThreadID;
ActiveHandle := GetWindowThreadProcessID(GetForeGroundWindow, nil);
AttachThreadInput(CurHandle, ActiveHandle, True);
FocusHandle := GetFocus;
//SendMessage(FocusHandle, WM_GetText, 0, 0); 可以用SendMessage得到焦点控件的Text,怎么用忘了,看一个TEdit那样方法。
Memo1.Lines.Add(Format('焦点控件的Handle: %d', [FocusHandle]);
AttachThreadInput(CurHandle, ActiveHandle, False);
end;
inherited;
end;

程序运行在后台,然后mouse点中一个TMemo, TEdit之类的东东,然后按Win + A,那Handle就在Memo1中了
lliihhaaoo 2001-09-14
  • 打赏
  • 举报
回复
就没有相关的API?例如GetLastFocusedCtrl :(
加载更多回复(1)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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