Delphi:如何获取TComboBox组件的句柄?

3
据我所知,Combobox由两个组件组成:Edit和ListBox。如果我有它的Edit字段的句柄,如何获取Combobox的句柄?我尝试使用GetWindow(MyHandle, GW_HWNDNEXT) ,其中MyHandle是我知道的Edit的句柄,但结果始终为0。有人有什么想法吗?
非常感谢。
3个回答

3
编辑窗口是组合框窗口的子窗口:使用GetParent函数。

踩一下让我怀疑自己是否理解错了什么。@born,你是在寻找下拉框的句柄吗? - Sertac Akyuz
不错,你理解得很正确。谢谢Sertac Akyuz,GetParent运行良好 :) - born2Run

1

TCustomCombo 定义了 ListHandleEditHandle 属性。这些属性具有受保护的可见性,但您可以通过子类化或使用标准技巧来访问受保护成员:

type
  TCheatComboBox = class(TComboBox);

function GetListHandle(Combo: TComboBox): HWND;
begin
  Result := TCheatComboBox(Combo).ListHandle;
end;

是的,但使用这种方法,我需要检查表单上的每个ComboBox,并将ListHandle中的值与MyHandle进行比较。这样可以工作,但Sertac Akyuz的答案在这种情况下更好一些。非常感谢! - born2Run
@born2run 看起来你拥有编辑窗口的句柄有些奇怪。因此我猜测这不是一个VCL表单,否则你应该从组合框窗口句柄开始,这在VCL源代码中被称为FDropHandle。 - David Heffernan
不是的,那只是普通的VCL表单。原因是我使用了hook钩子。请看下面答案中我的评论。谢谢。 - born2Run
@born2run 我本以为你可以在不使用钩子的情况下完成所有这些。 - David Heffernan

0

我曾经使用 WH_CBT 参数设置钩子。在钩子过程中,我通过单击某个 ComboBox 的编辑字段来捕获该句柄。 - born2Run

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接