已获取panel句柄,该如何获取panel容器里子控件的句柄?

解决方案 »

  1.   

    遍历panel.controls,如果是其他进程,可以枚举子窗口
      

  2.   

    panel.Controls.Find(/*你的子控件name*/,/*是否深度搜索*/).Handle //注意是否为null
      

  3.   

     private void button1_Click(object sender, EventArgs e)
            {
                foreach (Control ctrl in this.panel1.Controls)
                {
                    MessageBox.Show(ctrl.Handle.ToInt32());
                }
            }
      

  4.   

     foreach (Control item in this.Controls)
                {
                    if(item is TabControl)
                    {
                        foreach (Control item_sub in item.Controls)
                        {
                            item_sub.Text = "tab动态修改";
                            foreach (Control item_sub2 in item_sub.Controls)
                                item_sub2.Text = "tab子控件动态修改";                    }
                    }
                    else
                        item.Text = "动态修改";
                }
      

  5.   

    抱歉,我忘说了,是获取别人的程序panel上的控件句柄
      

  6.   

    1.可以使用Spy++找到你想监控的窗口的类名和标题名,通过这两个参数获取监控窗口的句柄
    IntPtr hWnd = FindWindow("#32770", "文件另存为");    2.通过Spy++,展开窗口树上的各个节点直到你要的控件,并且参考节点的顺序使用FindWindowEx函数从窗口句柄开始一级一级的往里找到你要的控件的句柄,下面的代码行是要找到【文件另存为】对话框内文件名的输入框,并且通过发消息来自动填入内容。
    IntPtr hChild;
    hChild = FindWindowEx(hWnd,IntPtr.Zero, "DUIViewWndClassName",String.Empty);
    hChild = FindWindowEx(hChild, IntPtr.Zero, "DirectUIHWND", String.Empty);          hChild = FindWindowEx(hChild, IntPtr.Zero, "FloatNotifySink",String.Empty);          hChild = FindWindowEx(hChild, IntPtr.Zero, "ComboBox", String.Empty);          hChild = FindWindowEx(hChild, IntPtr.Zero, "Edit", String.Empty); 
    SendMessage(hChild, WM_SETTEXT, IntPtr.Zero, "c:\1.txt");以上就是监控其他程序panel的思路。附:Spy++对于查看窗口的的组织结构和内部控件的详细信息来说是非常有效的工具,具体使用方法,可以去网上查哦。
      

  7.   

    7楼的方法我试过了,别的控件可以,但是在panel里的子控件不行。
      

  8.   


    我试了下,确实有问题,因为panel本身所属的类是属于window,通过FindWindowEx函数查找一个窗口内的窗口是行不通的,返回值始终是0。
    我换了个方法,使用GetWindow函数。1.FindWindow找到主窗体句柄。
    2.执行hChild = GetWindow(hWnd, GetWindow_Cmd.GW_CHILD);可找到panel控件的句柄。
    3.执行hChild = GetWindow(hChild , GetWindow_Cmd.GW_CHILD);可找到子控件的句柄,其中hChild是panel控件的句柄。但是这个方法有个曲折,在第二步的获取panel控件句柄的地方,第一次运行程序的时候不一定能获取到panel的句柄,获取到的是其他隐含窗口的句柄,程序多运行几次就能获取到panel的句柄了,在window的内部有个树,GetWindow是扫描这棵树,但是Window这个几点下面不是window的内部控件,而是Window内又隐含了一些其他的容器什么的。
    由于现在手头有个工作比较紧张,所以没时间研究下去,不过可以想办法通过句柄获取类信息什么的去过滤。下面是GetWindow的定义以及参数定义。[DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);enum GetWindow_Cmd : uint {
          GW_HWNDFIRST = 0,
          GW_HWNDLAST = 1,
          GW_HWNDNEXT = 2,
          GW_HWNDPREV = 3,
          GW_OWNER = 4,
          GW_CHILD = 5,
          GW_ENABLEDPOPUP = 6
    }
      

  9.   

    还有一个办法,就是用EnumChildWindows来枚举所有的控件。