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