当选择一个表单时,使与程序关联的所有表单显示在最前面

本文关键字:表单 关联 程序 前面 显示 选择 一个 | 更新日期: 2023-09-27 18:21:31

我的应用程序中有两个表单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);
}

编辑:

ParentHexCompare的值似乎是Null。如果我能以某种方式将其设置为MainForm,这会解决我的问题吗?如果是,我该如何设置?

第2版:

我已经使用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();
}

当选择一个表单时,使与程序关联的所有表单显示在最前面

您可以使用下面的API包装器将表单带到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);
  }

对我来说,这似乎足以在两种形式上设置TopMost=true和调用BringToFront()

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

像这样的东西。