Почему один путь кода сразу показывает форму сверху, а другой нет? - PullRequest
0 голосов
/ 15 августа 2011

Я поддерживаю программу на 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 Ответ

0 голосов
/ 19 августа 2011

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

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

form2.ShowDialog(this);

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

...