Почему один путь кода сразу показывает форму сверху, а другой нет?

Я поддерживаю C# .net программу, которая использует Castle Windsor в качестве фреймворка. Он также использует Skincrafter для украшения форм.

В нем есть функциональность, которая обнаруживает наличие файла на USB-устройстве и создает другую форму для работы с ним. Программное обеспечение проверяет файл либо при возникновении события USB в Windows, либо когда пользователь нажимает кнопку, которая вызывает повторную проверку.

Когда пользователь вызывает повторную проверку, если файл найден, форма появляется поверх основной формы и оформляется Skincrafter. Если событие USB возникает, то форма создается, но не появляется сверху (чтобы увидеть ее, щелкните по ней на панели задач) и не оформляется Skincrafter.

Оба метода обнаружения файла достигают одной и той же функции, которая предписывает другой части программы создать форму для работы с файлом. Единственное различие, которое я обнаружил при отладке, заключается в том, что метод принудительной повторной проверки использует основной поток, в то время как метод события USB имеет собственный дочерний поток, который проходит в отображаемую форму.

Это отдельный поток, который заставляет Windows не создавать форму сверху (и, вероятно, будет игнорироваться Skincrafter), или есть какая-то другая проблема?

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

Редактировать - Код:

Это простая реконструкция, которую я произвел. Новый проект WinForms с System.Management добавлен в ссылки. Просто создайте форму (FormStartPosition установлен на CenterScreen) с помощью кнопки и используйте этот код:

public partial class Form1 : Form
{
    private ManagementEventWatcher _eventWatcher = null;
    int devices = 0;

    public Form1()
    {
        InitializeComponent();
            WqlEventQuery q = new WqlEventQuery();
            q.EventClassName = "__InstanceOperationEvent";
            q.WithinInterval = new TimeSpan(0, 0, 3);
            q.Condition = @"TargetInstance ISA 'Win32_USBControllerDevice' ";
            _eventWatcher = new ManagementEventWatcher(q);
            _eventWatcher.EventArrived += new EventArrivedEventHandler(UsbEventArrived);
            _eventWatcher.Start(); // Start listen for events

    }

    private void UsbEventArrived(object sender, EventArrivedEventArgs e)
    {
        if(System.Environment.GetLogicalDrives().Length - devices != 0) {
            ShowThingy();
            devices = System.Environment.GetLogicalDrives().Length;
        }
    }


    private void button1_Click(object sender, EventArgs e)
    {
        ShowThingy();
    }

    private void ShowThingy()
    {
        Form form2 = new Form();
        form2.Size = new Size(50, 50);
        form2.StartPosition = FormStartPosition.CenterParent;
        form2.TopMost = true;
        form2.ShowDialog();
    }

}

Запустите и вставьте USB-устройство, и форма form2 должна появиться за основной формой.

Это не воссоздает проблему каждый раз. Но первый раз, когда я подключаю USB-устройство, кажется, всегда создается вторая форма позади первой. При нажатии на кнопку каждый раз появляется вторая форма сверху.

Я должен отметить, что я работаю под управлением Windows 7.

1 ответ

Вы не устанавливаете владельца для модального окна, и по умолчанию используется активное окно (которое может не быть вашим основным окном).

Что произойдет, если вы используете перегрузку ShowDialog, которая принимает владельца?

form2.ShowDialog(this);

Если это не сработает, это сильно пахнет поточностью. Можете ли вы попробовать изменить ваш обработчик событий USB для использования Invoke в форме?

Другие вопросы по тегам