Хостинг среды выполнения .NET и фокусировка на окнах, проблемы и несоответствия - PullRequest
3 голосов
/ 17 октября 2008

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

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

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

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

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

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

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


Редактировать: Ну, @ sam , вы были правы в том, что у нас были разные настройки в этом ряду. На обеих машинах установлен пакет обновления 3 (SP3) для Windows XP, но на моем компьютере работала классическая тема Windows, а на другой - новая тема XP. Смена темы на другом компьютере на классическую устраняет проблему, но если вернуться к теме XP, она не появляется снова.

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

Ответы [ 3 ]

2 голосов
/ 17 октября 2008

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

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

1 голос
/ 17 октября 2008

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

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

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

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

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

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

0 голосов
/ 17 октября 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...