C# 按类查找子窗口

C# 按类查找子窗口,c#,winapi,C#,Winapi,在第三方应用程序中选择照片时,我无法获取“编辑”字段句柄 Spy++可以正确显示所有内容,但是FindWindow失败。我可以得到窗口本身的句柄,父窗口。我想我需要寻找儿童窗口。我可以通过GetWindow获得一些句柄,但不清楚它们是什么。窗口标题为空FindWindowEx根本不起作用,返回0。我这样表示: IntPtr-hwndchild=(hwnd,IntPtr.Zero,null,“编辑”) 就像有人已经假设的那样。尝试EnumChildWindow方法。 根据您提供的屏幕截图,这里已

在第三方应用程序中选择照片时,我无法获取“编辑”字段句柄

Spy++可以正确显示所有内容,但是
FindWindow
失败。我可以得到窗口本身的句柄,父窗口。我想我需要寻找儿童窗口。我可以通过
GetWindow
获得一些句柄,但不清楚它们是什么。窗口标题为空
FindWindowEx
根本不起作用,返回0。我这样表示:

IntPtr-hwndchild=(hwnd,IntPtr.Zero,null,“编辑”)

就像有人已经假设的那样。尝试EnumChildWindow方法。
根据您提供的屏幕截图,这里已经有一个完整的示例,只需使用
FindWindow/Ex()
函数,就可以获得编辑控件的HWND,如下所示:

IntPtr hwndDlg=FindWindow(空,“选择图像”);
IntPtr hwndCBEx=FindWindowEx(hwndDlg,IntPtr.Zero,“ComboBoxEx32”,null);
IntPtr hwndCB=FindWindowEx(hwndCBEx,IntPtr.Zero,“组合框”,null);
IntPtr hwndEdit=FindWindowEx(hwndCB,IntPtr.Zero,“编辑”,null);
但是,一旦将HWND发送到ComboBoxEx控件,获取其编辑控件的HWND的正确方法是使用以下消息:

const int CBEM_GETEDITCONTROL=1031;
IntPtr hwndDlg=FindWindow(null,“选择图像”);
IntPtr hwndCBEx=FindWindowEx(hwndDlg,IntPtr.Zero,“ComboBoxEx32”,null);
IntPtr hwndEdit=SendMessage(hwndCBEx,CBEM_GETEDITCONTROL,0,0);

注意,对于标准ComboBox控件(可以使用消息从ComboBox控件获得),可以使用消息或函数。编辑控件的HWND在
COMBOBOXINFO.hwnItem
字段中返回

如果要查找父窗口的子窗口,则应使用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;
    }
}
std::vector FindChildrenByClass(HWND父类、常量std::string和目标类)
{
结构枚举WndParam{
std::矢量输出;
std::字符串目标;
}枚举参数;
enum_param.target=目标类;
枚举子窗口(
父母亲
[](HWND wnd,LPARAM LPARAM)->BOOL{
自动参数=重新解释强制转换(lparam);
字符类_名称[512];
GetClassName(wnd,类名,512);
如果(参数->目标==类名称)
参数->输出。推回(wnd);
返回TRUE;
},
重新解释强制转换(&enum)参数
);
返回枚举参数输出;
}
int main()
{
自动窗口=FindChildrenByClass(重新解释强制转换(0x0061024A),“编辑”);
用于(自动wnd:windows){

std::cout您可能正在查找。如果无效的C#代码行应该表示
FindWindowEx
的参数,那么该类是第三个参数,而不是第四个。-检索顶级窗口的句柄。。您必须枚举子级以获得屏幕截图上的低级窗口。@500 InternalServerError Ok,i知道,但如何按类获取子句柄?调用返回的每个句柄,并与您正在查找的句柄进行比较。请注意,同一个类通常有多个子窗口。谢谢,这是最好的简单解决方案