C# 按类查找子窗口
在第三方应用程序中选择照片时,我无法获取“编辑”字段句柄 Spy++可以正确显示所有内容,但是C# 按类查找子窗口,c#,winapi,C#,Winapi,在第三方应用程序中选择照片时,我无法获取“编辑”字段句柄 Spy++可以正确显示所有内容,但是FindWindow失败。我可以得到窗口本身的句柄,父窗口。我想我需要寻找儿童窗口。我可以通过GetWindow获得一些句柄,但不清楚它们是什么。窗口标题为空FindWindowEx根本不起作用,返回0。我这样表示: IntPtr-hwndchild=(hwnd,IntPtr.Zero,null,“编辑”) 就像有人已经假设的那样。尝试EnumChildWindow方法。 根据您提供的屏幕截图,这里已
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知道,但如何按类获取子句柄?调用返回的每个句柄,并与您正在查找的句柄进行比较。请注意,同一个类通常有多个子窗口。谢谢,这是最好的简单解决方案