日期:2014-05-18  浏览次数:21252 次

如何设置窗体的Z轴顺序,使之在某一个窗口之上
我想显示一个窗口,但不激活,目的是用该窗口模拟类似下拉框的下拉部分,显然,该窗口应该在当前窗口之上,但又不能设置TopMost=true,因为如果设置了TopMost,那么,该窗口会挡住输入法,通过设置窗体的ShowWithoutActivation为True,可以显示窗体但不激活,显示出来以后,会在当前窗口之上,这点已经没问题了,假如主窗口为Form1,另外一个为Form2,在Form2中,重载ShowWithoutActivation,返回True,那么,在Form1中:
Form2 m=new Form2();
m.Show();
  可以发现,Form2正确显示,且未激活,达到了预期的效果.
  现在的新问题时,当Form2显示出来以后,我们用鼠标点一下Form2,这时,Form2激活,再点一下Form1,Form1激活,这时,Form2跑到Form1后面去了,如果我们在Form1里面,再次使用m.Show();发现,Form2还是在Form1后面,虽然没有被激活,但却没有跑到当前窗口前面,这种情况该如何处理呢?换句话说,如何重新把该窗口的Z轴置于当前窗口之上?

------解决方案--------------------
我第一时间想到的是SetWindowPos……
------解决方案--------------------
探讨
我也试过
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern int SetWindowPos(IntPtr hwnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
将hwnd置于hWndInse……

------解决方案--------------------
如果我们在Form1里面,再次使用m.Show();
如何再次使用,这里动作如何触发,描述的很诡异哦。