Форма «Пожалуйста, подождите» скрывает основную форму - PullRequest
1 голос
/ 09 февраля 2010

У меня в приложении несколько длительных процессов, поэтому я создал форму WAIT PLEASE и вызываю другой поток, например:

public void ShowWait()
    {
        continueWait = true;
        ThreadPool.QueueUserWorkItem((x) =>
            {
                using (frmWait espera = new frmWait())
                {
                    espera.ShowInTaskbar = false;
                    espera.Show();
                    while (continueWait)
                        Application.DoEvents();
                    espera.Close();
                }
            });
    }

И чтобы закрыть форму я использую:

public void HideWait()
    {
        continueWait = false;
    }

Работает нормально, но у меня есть проблема, когда отображается форма ожидания, основная форма теряет фокус, а любое другое запущенное приложение (Excel, Word и т. Д.) Одновременно переходит в начало и мое приложение уходит к задней части всех приложений. Я пытался использовать Activate () и Focus (), но активируется только рамка на панели задач, но приложение остается на задней панели всех приложений.

Есть какой-нибудь свет на это?

Заранее спасибо

Ответы [ 5 ]

1 голос
/ 09 февраля 2010

Вы пытались использовать перегрузку Show, которая принимает окно владельца и передает ему нулевую ссылку? Я сталкивался с подобными проблемами в прошлом, которые были решены таким образом:

espera.Show(null);

Кажется, есть некоторая разница в поведении вызова Show() (который реализован в типе Control и который просто устанавливает Visible = true, что, в свою очередь, вызывает код в типе Form в этом случае) и звонит Show(owner).

1 голос
/ 09 февраля 2010

Я не могу воспроизвести другие приложения, идущие наверх, но, в связи с предложением Фредрика отказаться от цикла while, это работает для меня:

AutoResetEvent processing = new AutoResetEvent(false);

private void HideWait()
{
    processing.Set();
}

private void ShowWait()
{           
    ThreadPool.QueueUserWorkItem((x) =>
    {
        using (frmWait espera = new frmWait())
        {
            espera.ShowInTaskbar = false;
            espera.Show();
            processing.WaitOne();
            espera.Close();
        }
    });
}

EDIT:

Чтобы избежать потери основной формы:

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

static readonly int SW_SHOWNOACTIVATE = 4;

AutoResetEvent processing = new AutoResetEvent(false);

private void HideWait()
{
    processing.Set();
}

private void ShowWait()
{
    ThreadPool.QueueUserWorkItem(c =>
    {
        using (frmWait espera = new frmWait())
        {
            espera.ShowInTaskbar = false;
            ShowWindow(espera.Handle, SW_SHOWNOACTIVATE);
            processing.WaitOne();
            }
        });
    }
}
1 голос
/ 09 февраля 2010

Ваш фрагмент кода не воспроизводит проблему для меня. Что действительно важно, так это то, что происходит с основной формой. То, что вы видите, происходит не так уж необычно. Когда ваша форма ожидания закрывается, Windows начинает искать другое окно в вашем приложении, чтобы сосредоточиться на нем. Если он не может найти его, он выберет другое окно из другого процесса и выведет его на передний план. По сути, ваша основная форма исчезнет за этим окном.

Это гарантированно произойдет, когда ваша основная форма отключена. Возможно, вы установили для ее свойства Enabled значение false? Я полагаю, что это также может произойти, когда ваша основная форма все еще не отвечает на сообщения Windows, эта часть мутная.

Избегайте подобных проблем (и неправильного набора потоков, который вы используете для формы ожидания), выполняя трудоемкий код в фоновом потоке вместо потока пользовательского интерфейса. BackgroundWorker был разработан, чтобы сделать это легко.

0 голосов
/ 09 февраля 2010

Я думаю, вы хотите модальную форму, попробуйте

espera.ShowDialog();

ОТО Я действительно не понимаю, чего вы хотите, поэтому я могу ошибаться.

0 голосов
/ 09 февраля 2010

Надеюсь, я правильно понимаю вашу проблему. Итак, вы хотите, чтобы WaitForm всегда был на вершине? Если это так, вы установили

espera.TopMost = true;

свойство?

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