Windows 7 рассматривает полноэкранные приложения по-другому?

У меня есть скрытый процесс, который ожидает нестандартной аппаратной кнопки, передает и запускает приложение (с CreateProcess). Никакая проблема с пользователем, нарушающим, это - действие, которое пользователь утвердил сам. Все прекрасно, когда это - обычное расположение с показанной панелью задач, и умножьтесь озаглавленный и не озаглавленные - окна. Но ситуация отличается в XP и 7, когда текущее приложение является полным экраном. Полноэкранное приложение в этом случае является окном без границ, имеющих точно тот же размер как экран. Windows скрывает панель задач для такого приложения, даже если это всегда включено.

В Xp это в порядке, панель задач показывают в этом случае и appication (например, калькулятор) также, полноэкранное приложение все еще видимо в областях кроме запущенного приложения и панель задач'. Но в Windows 7 не происходит ничего визуального, полноэкранное приложение все еще включено и если я переключаюсь на панель задач, выполняемое приложение там. Я пытался решить его с SetForegroundWindow, BringWindowToTop, даже AllowSetForegroundWindow (GetCurrentProcessId ()) призывают к дескриптору окна, найденному с CreateProcess-WaitForIntputIdle-EnumThreadWindows, никаким изменением. Что-то изменялось начиная с XP, связанного с полноэкранными окнами, которые официально зарегистрировали?

Спасибо,

Max

1
задан Dirk Vollmar 30 June 2010 в 22:34
поделиться

3 ответа

Я мог бы предположить, что если у вас есть собственное аппаратное устройство, существует некоторый API для генерации "реального" пользовательского ввода. Очевидно, что устаревшие клавиатура и мышь, а теперь и драйверы USB HID (многие из которых, я думаю, работают в пользовательском режиме?) Имеют для этого доступ к API.

Synergy +, например, может генерировать фальшивые события клавиатуры и мыши на подключенных компьютерах, и последствием фальшивого ввода является обычная активация переключения окон.

Итак, моя первоначальная идея состоит в том, чтобы ваше приложение «Устройство» в пользовательском режиме синтезировало фактические сообщения клавиатуры - SendInput кажется вероятным кандидатом на «API, который может« подделывать »реальные события ввода пользователя.

Затем используйте API, например ЗарегистрируйтеHotKey в своем приложении "UI", чтобы реагировать на комбинацию горячих клавиш, генерируемую вашим приложением на устройстве.

Теперь (при условии, что SendInput генерирует события пользовательского ввода на правильном уровне), вы должны (из обработчика WM_HOTKEY в вашем приложении UI ) иметь разрешение (потому что все было "инициировано пользователем") на изменение окна переднего плана (на себя).

1
ответ дан 2 September 2019 в 23:24
поделиться

Vista представила функцию композиции рабочего стола . Короче говоря, все окна рисуются в растровых изображениях памяти, а затем диспетчер окон рабочего стола составляет эти растровые изображения и рисует на полноэкранной поверхности Direct3D. Полноэкранные окна не участвуют в композиции рабочего стола и могут рисовать прямо на экране (в основном потому, что большинство полноэкранных приложений - это игры, требующие обновления экрана в реальном времени).

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

К сожалению, у меня нет хорошего решения вашей проблемы. Один из способов решить эту проблему - добавить стиль WS_CAPTION в ваше приложение, а затем самостоятельно обработать WM_NCPAINT / WM_NCCALCSIZE / WM_NCHITTEST . Это позволит вам солгать DWM, что вы - обычное оконное приложение, но визуально изменить область ЧПУ, чтобы она выглядела так, как будто у вас нет заголовка. Однако это требует определенного количества дополнительного кода и может потребовать немного больше усилий, которые вы захотите вложить.

Другой способ решения проблемы - явное сворачивание полноэкранного окна приложения при запуске нового процесса. Однако тогда вам придется решить проблему, когда снова максимизировать его.

Кстати, вы можете найти комментарии к этому сообщению от Раймонда Чена интересными.

1
ответ дан 2 September 2019 в 23:24
поделиться

Windows поддерживает несколько рабочих столов , и я предполагаю, что в полноэкранном режиме используется рабочий стол, отличный от рабочего стола по умолчанию (где будет отображаться ваше приложение) . Объект рабочего стола в Windows - это «логическая поверхность отображения, содержащая объекты пользовательского интерфейса, такие как окна, меню и перехватчики». Например, хранители экрана обычно запускаются на отдельном рабочем столе.

Вы можете узнать, на каком рабочем столе запущено приложение, с помощью Process Explorer:

  • Настройте Process Explorer для замены диспетчера задач и всегда запускать поверх него.
  • Когда откроется полный экран, запустите Process Explorer, нажав Ctrl + Shift + Esc
  • В Process Explorer выберите полноэкранный процесс и нажмите Ctrl + H, чтобы отобразить дескрипторы этого процесса
  • См. значение пункта Рабочий стол в списке. Обычно это значение По умолчанию

Если вы знаете, на каком рабочем столе запущено это приложение, вы можете запустить свой процесс на том же рабочем столе, сначала вызвав OpenDesktop , чтобы получить дескриптор этого рабочего стола и затем передайте его в STARTUPINFO вашего вызова CreateProcess .

0
ответ дан 2 September 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: