2010-06-30 2 views
1

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

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

Спасибо,

Max

+0

Когда вы пробовали 'SetForegroundWindow', вы также проверили код ошибки? (BTW, 'AllowSetForegroundWindow (GetCurrentProcessId())' бессмысленно. Http://blogs.msdn.com/b/oldnewthing/archive/2009/02/20/9435239.aspx) – jamesdlin

ответ

0

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

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

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

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

+0

По умолчанию полноэкранные приложения используют одинаковые как любые другие приложения. –

+0

@ Франси Пенов: Правда, но кто говорит, что это приложение делает? Разумеется, это просто предположение, но стоит упомянуть, что в этом случае процесс, начинающийся с 'CreateProcess', не будет видимым, и вы увидите те же самые симптомы, что описаны OP. –

+0

Вы правы, это возможность. Тем не менее, запуск на отдельном рабочем столе довольно необычный сценарий, поэтому я бы подумал, что OP явно упомянул об этом. –

1

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

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

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

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

Btw, вы можете найти комментарии на this post от Raymond Chen интересного.

+0

С моей точки зрения, композиция рабочего стола не должна влиять на вызовы 'SetForegroundWindow',' BringWindowToTop' и тому подобное. –

+0

Я считаю, что 'SetForegroundWindow' не позволяет прерывать полноэкранные приложения, чтобы предотвратить появление фоновых процессов над играми. 'BringWindowToTop' манипулирует Z-порядком, а полноэкранные приложения не участвуют в нормальном z-порядке (или были установлены как самые верхние, когда активны - не помню точно) –

+0

Затем я еще не рассматривал это для пару лет, поэтому я мог забыть все, что знал. :-) –

1

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

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

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

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

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

Смежные вопросы