Сделайте так, чтобы все формы, связанные с программой, выходили на первый план, когда выбрана одна форма - PullRequest
4 голосов
/ 26 января 2012

В моем заявлении есть две формы MainForm и HexCompare.Если я щелкаю свое приложение в другом окне, то я нажимаю на одну из двух форм, и только одна из них выходит вперед.Как я могу сделать так, чтобы, если я щелкну по одной из двух форм, она выведет обе наверх всех открытых форм в приложении?Сейчас мне нужно выбрать каждую форму по отдельности, чтобы они попали на вершину моего стека окон (и это может быть очень раздражающим из-за того, что HexCompare имеет ShowInTaskbar, установленный на 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:

Я частично решил ее, используя решение Тиграна, но он вызывает мерцание, когда каждая форма выводится на передний план, если есть лучшее решение, которое я все еще заинтересован.

//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 ]

5 голосов
/ 26 января 2012

Вы можете использовать следующую 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);
  }
0 голосов
/ 26 января 2012

Мне кажется, этого должно быть достаточно, чтобы установить TopMost=true и вызвать BringToFront() на обеих формах.

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

Как то так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...