3 回答
![?](http://img1.sycdn.imooc.com/545861b80001d27c02200220-100-100.jpg)
TA贡献1860条经验 获得超9个赞
根据您提供的屏幕截图,仅使用FindWindow/Ex()
函数,您可以获得编辑控件的 HWND,如下所示:
IntPtr hwndDlg = FindWindow(null, "Choose an image"); IntPtr hwndCBEx = FindWindowEx(hwndDlg, IntPtr.Zero, "ComboBoxEx32", null); IntPtr hwndCB = FindWindowEx(hwndCBEx, IntPtr.Zero, "ComboBox", null); IntPtr hwndEdit = FindWindowEx(hwndCB, IntPtr.Zero, "Edit", null);
但是,一旦获得了 ComboBoxEx 控件的 HWND,获取其 Edit 控件的 HWND 的正确CBEM_GETEDITCONTROL
方法是使用以下消息:
const int CBEM_GETEDITCONTROL = 1031; IntPtr hwndDlg = FindWindow(null, "Choose an image"); IntPtr hwndCBEx = FindWindowEx(hwndDlg, IntPtr.Zero, "ComboBoxEx32", null); IntPtr hwndEdit = SendMessage(hwndCBEx, CBEM_GETEDITCONTROL, 0, 0);
请注意,对于标准 ComboBox 控件(可以使用CBEM_GETCOMBOCONTROL
消息从 ComboBoxEx 控件获取),可以使用CB_GETCOMBOBOXINFO
消息或GetComboBoxInfo()
函数。该字段中返回编辑控件的 HWND COMBOBOXINFO.hwndItem
。
![?](http://img1.sycdn.imooc.com/5333a1920001d36402200220-100-100.jpg)
TA贡献1859条经验 获得超6个赞
如果您正在寻找父窗口的子窗口,您应该使用 EnumChildWindows。以下是 C++ 代码,但可以轻松调用:您可以将委托编组为回调的函数指针。
std::vector<HWND> FindChildrenByClass(HWND parent, const std::string& target_class)
{
struct EnumWndParam {
std::vector<HWND> output;
std::string target;
} enum_param;
enum_param.target = target_class;
EnumChildWindows(
parent,
[](HWND wnd, LPARAM lparam) -> BOOL {
auto param = reinterpret_cast<EnumWndParam*>(lparam);
char class_name[512];
GetClassName(wnd, class_name, 512);
if (param->target == class_name)
param->output.push_back(wnd);
return TRUE;
},
reinterpret_cast<LPARAM>(&enum_param)
);
return enum_param.output;
}
int main()
{
auto windows = FindChildrenByClass( reinterpret_cast<HWND>(0x0061024A), "Edit");
for (auto wnd : windows) {
std::cout << std::hex << wnd << std::endl;
}
}
请注意,上面我没有在回调 lambda 中递归调用 FindChildrenByClass。这不是一个错误。EnumChildWindows 已经执行了此递归。它在父窗口的子窗口和孙子窗口等上运行,开箱即用,无需您指定此行为或实现它。
- 3 回答
- 0 关注
- 137 浏览
添加回答
举报