Почему один путь кода сразу показывает форму сверху, а другой нет?
Я поддерживаю 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 в форме?