选择一个表单时,使与程序关联的所有表单都出现在前面

时间:2012-01-25 22:15:53

标签: c# .net winforms .net-4.0

我的应用MainFormHexCompare中有两种表单。如果我点击我的应用程序到另一个窗口然后我点击两个表单中的一个,只有其中一个来到前面。如果我单击两个表单中的任何一个表单,它将如何使其成为应用程序中所有打开表单的顶部?现在我需要单独选择每个表单以使它们到达我的窗口堆栈顶部(由于HexCompareShowInTaskbar设置为false,这可能非常烦人

这个工作方式的一个很好的例子就是我想要的方式是大多数查找对话框的工作原理。如果单击查找对话框,如果主窗体被另一个应用程序隐藏,它会将主窗体带到前面,如果单击主窗体,如果它被另一个应用程序隐藏,则查找对话框将出现在前面。

如何调用MainForm

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new MainForm());
}

如何调用HexCompare

private void lstCaputres_SelectedIndexChanged(object sender, EventArgs e)
{
    var selectedItem = (Tuple<DateTime, byte[]>)lstCaputres.SelectedItem;
    if (hexCompare == null || hexCompare.IsDisposed)
    {
        hexCompare = new HexCompare(selectedItem.Item2);
        hexCompare.Show();
    }
    else
        hexCompare.ChangeValue(selectedItem.Item2);
}

编辑:

似乎HexCompare Parent的值为Null。如果我能以某种方式将其设置为MainForm,那将解决我的问题,如果可以,我该如何设置它?

EDIT2:

我已经使用Tigran的解决方案对其进行了半解决,但是如果有更好的解决方案我仍然感兴趣的话,它会导致闪烁,因为每种形式都会被带到前面。

//In MainForm.cs
private void MainForm_Activated(object sender, EventArgs e)
{
    hexCompare.BringToFront();
    this.BringToFront();
}

//in HexCompare.cs
private void HexCompare_Activated(object sender, EventArgs e)
{
    parent.BringToFront();
    this.BringToFront();
}

2 个答案:

答案 0 :(得分:5)

您可以使用以下API wrapper将表单放到z顺序的前面,而不会将其转移到焦点上。可以在主窗体的Activated事件中调用此函数,只需将HexCompare窗体作为参数传递给它即可。这与其他答案不同,但我从未见过你在评论中提到的任何闪烁。

  private const int SW_SHOWNOACTIVATE = 4;
  private const int HWND_TOPMOST = 0;
  private const uint SWP_NOACTIVATE = 0x0010;

  [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
  static extern bool SetWindowPos(
       int hWnd,           // window handle 
       int hWndInsertAfter,    // placement-order handle 
       int X,          // horizontal position 
       int Y,          // vertical position 
       int cx,         // width 
       int cy,         // height 
       uint uFlags);       // window positioning flags 

  [DllImport("user32.dll")]
  static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

  public void ShowInactiveTopmost(Form frm)
  {
     ShowWindow(frm.Handle, SW_SHOWNOACTIVATE);
     SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST,
     frm.Left, frm.Top, frm.Width, frm.Height,
     SWP_NOACTIVATE);
  }

答案 1 :(得分:0)

对我来说,似乎应该足以设置TopMost=true并在两个表单上调用BringToFront()

hexCompare = new HexCompare(selectedItem.Item2);
hexCompare.TopMost = true;
hexCompare.Show();
hexCompare.BringToFront();

像这样。