2016-08-31 1 views
2

Если у моего окна есть расширенный набор стиля «всегда сверху», я ожидаю, что он будет поверх всех окон, у которых нет набора стиля «Всегда сверху» и тех окон, которые имеют «Всегда сверху», но были активированы до того, как мое окно было активировано.Является ли диспетчер задач специальным видом окна «Всегда поверх» для окон 10?

Чтобы проверить эту функцию, я открою окно диспетчера задач - установите его всегда сверху, а затем я открою свое окно (myWindow).

В Windows 7 я наблюдаю за ожидаемым поведением - myWindow входит в состав диспетчера задач.

Однако в Windows 10 это не тот случай. Диспетчер задач «всегда сверху» других окон, даже если эти окна сами имеют набор «всегда сверху».

Есть ли что-то особенное, что они делают с диспетчером задач в Windows 10? Если да, есть ли какая-то работа для того, чтобы принести мое окно поверх диспетчера задач? Я пробовал просто использовать функцию BringWindowToTop, но это не работает. Также нет setWindowPos с HWND_TOP в качестве значения для аргумента hWndInsertAfter.

+0

Для дальнейших испытаний вещей, я создал два окна с 'всегда сверху' расширенного стиля установлен, и я мог бы один поверх другого, в зависимости от того, какое окно было активировано последним. – TheBlueNotebook

+1

Да, диспетчер задач является специальным. Вы не можете быть на высоте. –

+1

Сделайте логический скачок: [Что делать, если две программы сделали это?] (Https://blogs.msdn.microsoft.com/oldnewthing/20050607-00/?p=35413) (плюс [Практический экзамен] (https: // blogs.msdn.microsoft.com/oldnewthing/20101125-00/?p=12203)). Если этот мысленный эксперимент (и практический экзамен) не убедил вас, вот еще один взгляд на дилемму, которую вы пытаетесь создать: [Как создать верхнее окно, которое никогда не покрывается другими верхними окнами?] (Https://blogs.msdn.microsoft.com/oldnewthing/20110310-00/?p=11253). – IInspectable

ответ

7

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

Чтобы ответить на ваш реальный вопрос, для этого нет документально подтвержденного API. WS_EX_TOPMOST - лучшее, что вы получаете. Это означает помощь для пользователя, а не способ травления окна вашего приложения в сетчатке.

Когда два разных окна имеют этот стиль, поведение зависит от реализации. Единственная гарантия, которую вы получаете, - это окна с стилем WS_EX_TOPMOST, всегда на вершине других окон без этот стиль в порядке Z. В противном случае система может разрешать конфликты по своему усмотрению, в том числе поддерживать самое последнее активное верхнее окно сверху, прерывать связь, заставляя окна, принадлежащие системным компонентам, вверху, или даже наказывать процессы, которые имеют более одного окна с этот стиль, заставляя их окна (ы) на дно «самого верхнего» стека.

Связанные чтения:

4

Из небольшого исследования, которое я сделал некоторое время назад:

  • Диспетчер задач действительно «особый вид» от Always-On-Top.
  • Окно диспетчера задач создается со следующей недокументированной функцией: CreateWindowInBand.
  • Попытка использовать эту функцию из другого процесса приводит к ERROR_ACCESS_DENIED. Возможно, только подписанный процесс Microsoft может использовать его.
+0

Любые идеи о том, как я могу определить, действительно ли конкретное окно является «особым видом» вершины, поскольку у меня есть его дескриптор окна. Вероятно, способ, которым вы пришли к выводу, что диспетчер задач создан с помощью 'CreateWindowInBand', может дать мне некоторые подсказки здесь? – TheBlueNotebook

+1

@TheBlueNotebook попробуйте 'USER32.GetWindowBand'. – Paul

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