Основы WinAPI в C ++ - переключение между окнами - PullRequest
4 голосов
/ 15 февраля 2012

Не очень уверен, как объяснить это ясно.По сути, дело в том, что я ищу способ изменить текущее активное окно (самостоятельно созданное определение, надеюсь, оно будет достаточно понятным) - окно, в котором текст печатается прямосейчас.Ухх.

Я уже обнаружил, что msdn help и SetFocus () или SetActiveWindow (), но это не решает мою проблему (или, что также возможно, япросто неправильно его использовать).

Просто:

HWND Dest = GetFocus();
... //Some moving around on the 'alt-tab level' :-|
SetFocus(Dest); 

Не активирует окно Dest снова.Пожалуйста, извините за вопросы новичка, надеюсь, это не займет у вас много времени.Thanx!

Ответы [ 2 ]

3 голосов
/ 15 февраля 2012

SetFocus () не выводит окно наверх. Он просто устанавливает фокус клавиатуры.

SetActiveWindow () , с другой стороны, выводит конкретное окно сверху, но только если приложение, которое вызывает его, является также приложением, которому оно принадлежит. (согласно документации).

Когда вы говорите, что пробовали SetActiveWindow (), что вы имеете в виду? Как это не удалось? Какие результаты это дало?

Еще одна функция, которую вы можете попробовать: SetForegroundWindow () на тот случай, если вы хотите активировать окно, принадлежащее другому приложению, но это имеет свои проблемы, как вы видите ниже (непосредственно из документации):

Система ограничивает, какие процессы могут устанавливать окно переднего плана. Процесс может установить окно переднего плана, только если один из следующих условия верны:

  • Процесс является процессом переднего плана.
  • Процесс был запущен процессом переднего плана.
  • Процесс получил последнее входное событие.
  • Нет процесса переднего плана.
  • Процесс переднего плана отлаживается.
  • Передний план не заблокирован (см. LockSetForegroundWindow).
  • Истекло время ожидания блокировки переднего плана (см. SPI_GETFOREGROUNDLOCKTIMEOUT в SystemParametersInfo).
  • Нет активных меню.
2 голосов
/ 15 февраля 2012

Попробуйте использовать функцию SetForegroundWindow .

Однако обратите внимание, что на это есть ограничения, которые объясняются в разделах замечаний на странице MSDN, и я скопировал их сюда.

Система ограничивает, какие процессы могут устанавливать окно переднего плана. Процесс может установить окно переднего плана, только если один из следующих условия верны:

  • Процесс является приоритетным процессом. Процесс был запущен процессом переднего плана.
  • Процесс получил последнее входное событие.
  • Нет процесса переднего плана.
  • Процесс переднего плана отлаживается.
  • Передний план не заблокирован (см. LockSetForegroundWindow).
  • Истекло время ожидания блокировки переднего плана (см. SPI_GETFOREGROUNDLOCKTIMEOUT в SystemParametersInfo).
  • Меню не активны.

Приложение не может заставить окно на передний план, пока пользователь работает с другим окном. Вместо этого Windows мигает панель задач кнопка окна для уведомления пользователя.

Это означает, что если вы не владеете текущим процессом переднего плана (что, вероятно, имеет место, когда пользователь перемещается), вы не можете установить новое окно переднего плана.

Есть несколько хаков (google SetForegroundWindow, и вы их найдете), но они хаки и не очень хорошая идея - позволяют пользователю решать, что находится на переднем плане! (также, как объясняет Рэймонд Чен на его блог здесь хаки часто приводят к зависанию программы)

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