Размещенная среда выполнения .NET и фокус окна, проблемы и несоответствия

У нас есть приложение Win32, в котором размещается среда выполнения .NET и открываются управляемые формы .NET из части приложения Win32.

Эти окна всегда открываются как модальные окна.

На некоторых машинах, когда эти окна закрыты, окно Win32, которое находится позади, не получает фокуса, а отправляется за Word, Outlook или что-то еще, что у вас может быть открыто.

Кроме того, иногда, если мы открываем такую ​​​​форму .NET, затем нажимаем Alt-Tab на Word или какое-либо другое приложение, а затем щелкаем значок на панели задач для нашего приложения, появляется окно Win32. Это, конечно, все еще ждет закрытия модального окна .NET, поэтому его, конечно, нельзя использовать. Если мы переместим Alt-Tab на что-то другое и просто свернём это другое, то снова появится наше окно .NET.

Непоследовательная часть заключается в том, что это происходит только на некоторых машинах, а не на всех. На многих машинах, включая мою, он работает именно так, как ожидалось. Фокус на правое окно работает каждый раз.

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

Кто-нибудь знает, что я должен искать? Мы рассмотрели установленные среды выполнения .NET, и, поскольку две такие машины, на одной из которых работает, а на другой нет, являются машинами разработчиков, они содержат одни и те же пакеты обновлений для .NET и так далее.


Редактировать: Хорошо, @sam, вы были правы в том, что у нас были разные настройки в этом переулок. Обе машины работают под управлением Windows XP SP3, но на моей была установлена ​​классическая тема Windows, а на другой — новая тема XP. Изменение темы на этом другом компьютере на классическую устранило проблему, но изменение ее обратно на тему XP не привело к ее повторному появлению.

Итак, теперь у нас есть две машины, на которых это работает, и у клиента все еще есть проблема, хотя клиент, по-видимому, использует классическую тему.


person Lasse V. Karlsen    schedule 17.10.2008    source источник


Ответы (3)


В последнее время я заметил, что фокус окна в Windows Vista Aero устанавливается иначе, чем в XP. Вместо того, чтобы последнее активированное окно приложения получало фокус, главное окно получит фокус при повторной активации.
Забавно то, что при смене темы Windows Vista на старый стиль (классический или базовый) фокус будет установлен. к дочернему окну, в котором оно было последним, как в XP.

Ваша проблема может быть совсем другой, но, может быть, у вас разные версии ОС?

person Sam    schedule 17.10.2008

Эта проблема напоминает мне, что WPF имеет ту же проблему с отображением диалогов из родительского окна.

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

Любой элемент управления из формы Windows (которые также включают в себя формы) реализует интерфейс с именем IWin32Window, который предоставляет дескриптор Win32 этого окна.

Что вы можете сделать, так это использовать NativeWindow для прослушивания WM_ACTIVATEAPP или любого другого события, которое будет сигнализировать о том, что ваше приложение имеет фокус, и отправить сигнал в окно .NET, чтобы получить фокус.

Другой вариант - использовать собственный диалог, в котором размещается пользовательский элемент управления .net вместо winforms (если вы можете).

Я делал это раньше без лишней суеты, используя C++\CLI, но сейчас мне это не приходит в голову. Возможно, это будет хорошей отправной точкой для вас.

person Bogdan Maxim    schedule 17.10.2008
comment
Если вы найдете решение, пожалуйста, напишите его, так как это может помочь и другим - person Bogdan Maxim; 17.10.2008

Я помню, как помогал другу с той же проблемой (не помню, где это было в .net 2.0 или 3.5)

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

Form2 form2 = new Form2();
form2.ShowDialog();

Чтобы отобразить модальное всплывающее окно, теперь, по-видимому, кажется, что метод ShowDialog не использует форму, вызывающую ShowDialog в качестве своего обработчика по умолчанию, поэтому вам нужно сделать

form2.ShowDialog(this);

Таким образом, приложение, насколько мне известно, знает, к какому дескриптору вернуться, и, таким образом, всегда возвращается к вашему основному серверу.

Дополнительная информация о форме ShowDialog msdn: http://msdn.microsoft.com/en-us/library/w61zzfwe.aspx

person thmsn    schedule 17.10.2008
comment
Спасибо, мы знаем об этом, но когда форма .NET отображается из неуправляемого кода, она становится немного сложнее. - person Lasse V. Karlsen; 17.10.2008