如何使窗体显示在特定窗体的前面,这个特定的窗体可能不是在最前面? 
比如桌面上有4个程序窗体,分别为A,B,C,D,A显示在B窗体前面,B显示在C窗体前面,C显示在D窗体前面,当我的程序打开时,我的窗体要显示在D的前面,C窗体的后面,如何实现? 层次结构为A ->B->C->D         IntPtr[] hwnd = new IntPtr[4];             
            hwnd[0] = new IntPtr(67738);    (A) 
            hwnd[1] = new IntPtr(461442); (B) 
            hwnd[2] = new IntPtr(461498); (C) 
            hwnd[3] = new IntPtr(328290); (D) 
            //以上为窗体的句柄 frm为自己的窗体             int hwp = BeginDeferWindowPos(4); 
            DeferWindowPos(hwp, frm.Handle, WindowMessage.HWND_TOP, 0, 0, 0, 0, WindowMessage.SWP_NOMOVE | WindowMessage.SWP_NOSIZE); 
            DeferWindowPos(hwp, hwnd[2], WindowMessage.HWND_TOP, 0, 0, 0, 0, WindowMessage.SWP_NOMOVE | WindowMessage.SWP_NOSIZE); 
            DeferWindowPos(hwp, hwnd[1], WindowMessage.HWND_TOP, 0, 0, 0, 0, WindowMessage.SWP_NOMOVE | WindowMessage.SWP_NOSIZE); 
            DeferWindowPos(hwp, hwnd[0], WindowMessage.HWND_TOP, 0, 0, 0, 0, WindowMessage.SWP_NOMOVE | WindowMessage.SWP_NOSIZE); 
            EndDeferWindowPos(hwp); 
上面代码的思路是依次把依次把自己-》C-》B-》A 设置为最前面,但最后的结果不是这个的

解决方案 »

  1.   

    最基本的
    Form.Owner = 后面的窗体;
    表示form是这个窗体的一员,永远在这个窗体前
      

  2.   

      private void button1_Click(object sender, EventArgs e)
            {
                Form frma = new Form();
                frma.Text = "a";
                frma.Show();            Form frmb = new Form();
                frmb.Text = "b";
                frmb.Show();            Form frmc = new Form();
                frmc.Text = "c";
                frmc.Show();            Form frmd = new Form();
                frmd.Text = "d";
                frmd.Show();            frma.BringToFront();
                frmc.BringToFront();
                frmb.BringToFront();
                frmd.BringToFront();
                 
            }
      

  3.   

    测试 //using System.Runtime.InteropServices;
            [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
            public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, int flags);
            private void button1_Click(object sender, EventArgs e)
            {
                Form frma = new Form();
                frma.Text = "a";
                frma.Show();            Form frmb = new Form();
                frmb.Text = "b";
                frmb.Show();            Form frmc = new Form();
                frmc.Text = "c";
                frmc.Show();            Form frmd = new Form();
                frmd.Text = "d";
                frmd.Show();            SetWindowPos(frma.Handle,(IntPtr)0, 0, 0, 0, 0, 3);
                SetWindowPos(frmc.Handle, (IntPtr)0, 0, 0, 0, 0, 3);
                SetWindowPos(frmd.Handle, (IntPtr)0, 0, 0, 0, 0, 3);
                SetWindowPos(frmb.Handle, (IntPtr)0, 0, 0, 0, 0, 3);
            }
      

  4.   

    我测试过没有问题了,一个项目生成四个窗体,并显示出来,把handle都记下来然后,另外开一个项目,测试代码类似
    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
            public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, int flags);
            private void button1_Click(object sender, EventArgs e)
            {
                SetWindowPos((IntPtr)71872, (IntPtr)0, 0, 0, 0, 0, 3);
                SetWindowPos((IntPtr)71862,(IntPtr)0, 0, 0, 0, 0, 3);
                SetWindowPos((IntPtr)71868, (IntPtr)0, 0, 0, 0, 0, 3);
                SetWindowPos((IntPtr)71870, (IntPtr)0, 0, 0, 0, 0, 3);
               
            }其中第一项目的四个窗体会按照SetWindowPos的顺序显示出来。
      

  5.   

    谢谢您的一直观注,按下面的代码,有个问题就是,我的程序会和71862这句柄的窗体一起显示在前面,还有要说的是我的程序窗体是一个不规则窗体。如果您可以的话我可以把测试程序发给您测试。
    SetWindowPos((IntPtr)71872, (IntPtr)0, 0, 0, 0, 0, 3); 自己的程序窗体
    SetWindowPos((IntPtr)71862,(IntPtr)0, 0, 0, 0, 0, 3);  其它程序窗体 (一起显示的窗体)  
    SetWindowPos((IntPtr)71868, (IntPtr)0, 0, 0, 0, 0, 3); 其它程序窗体 
    SetWindowPos((IntPtr)71870, (IntPtr)0, 0, 0, 0, 0, 3); 其它程序窗体 
      

  6.   

    你有没有QQ或者MSN?直接说比较好
      

  7.   

    非常抱歉,没多少 WinForm 经验,P/Invoke 也不熟悉
      

  8.   

    关于 Form.BringToFront 方法
    http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.bringtofront.aspx比如桌面上有4个程序窗体,分别为A,B,C,D,A显示在B窗体前面,B显示在C窗体前面,C显示在D窗体前面,当我的程序打开时,我的窗体要显示在D的前面,C窗体的后面,如何实现?
    =======
    不同的程序的? 不知道有什么意义,这样做?
      

  9.   

    其实你应该参考msagent,就像瑞星小狮子那样的技术。
      

  10.   

    SetWindowPos是没有问题的,你的代码不知道为什么把那么多handle都写死...