Как избежать конкуренции между перекрывающимися окнами в Windows Forms/SlimDX
Я создаю приложение Windows Forms в C#, в котором используются библиотеки SlimDX(управляемая оболочка Direct3D API). Проблемы возникают, когда я пытаюсь перевести приложение в полноэкранный режим (состояние, в котором главное окно покрывает всю область рабочего стола, включая панель задач).
Окно устройства Direct3D (главное окно) отображается правильно. Панель задач и другие перекрывающиеся окна полностью скрыты окном устройства. Курсор, однако, кажется, принадлежит окну непосредственно под окном устройства. Это видно по внешнему виду и поведению курсора. Когда я нажимаю на окно устройства, фокус меняется на окно внизу. Это неожиданное поведение для любого окна.
Кроме того, я могу щелкать элементы на панели задач, что приведет к изменению фокуса.
Я меняю стиль окна устройства на "TopMost" и "Popup". Кроме того, я слежу за служебным классом, найденным в DirectX SDK. Когда я запускаю пример из DX SDK, который использует Win32, эта проблема не возникает. Возможно ли, что проблема связана с моим использованием Windows Forms?
В моем приложении много кода, поэтому я надеялся получить теоретические ответы о том, почему эта проблема может возникнуть. Я нашел здесь ветку, описывающую проблему, возникающую при использовании полноэкранного устройства, однако это решение неприемлемо. Было предложено использовать "оконный полноэкранный режим". Вместо изменения режима отображения адаптера для полноэкранного режима окно устройства будет просто изменено, чтобы охватить весь экран. Это решение предотвратит использование форматов адаптера, разрешений и частоты обновления, доступных в полноэкранном режиме.
Любые предложения будут высоко ценится!
1 ответ
Проблема была связана с природой элементов управления в Windows Forms. Из MSDN:
Элемент управления можно выбрать и получить фокус ввода, если выполняются все следующие условия: значение Selectable для ControlStyles установлено в значение true, оно содержится в другом элементе управления, и все его родительские элементы управления видны и включены.
Окно устройства в моем приложении принадлежит родительскому окну, и родительское окно становится невидимым после включения полноэкранного режима. Возможно, что конфликт возник из-за вышеуказанных "правил фокуса". Чтобы проверить теорию, я проверил возвращаемое значение из DeviceWindow.Focus()(происходит от Control.Focus())..., который возвратил false.
Мое решение состояло в том, чтобы создать форму, используемую с единственной целью изменения полноэкранного режима. Теперь, когда я хочу перейти в полноэкранный режим, я перезагружаю устройство с помощью ручки в новом окне устройства. Все проблемы решены...