Как установить окно поверх другого? - PullRequest
3 голосов
/ 19 января 2012

Я пишу собственное окно всплывающей подсказки (назовем его A).Он должен отображаться поверх другого окна (назовем его B) и:

  • Не крадите фокус с B

  • Непотерять свою позицию в z-порядке до B, пока пользователь продолжает ввод в B

  • A должен получать сообщения WM_NCHITTEST (я использую их для отслеживания положения мыши над неактивным окном)

  • Когда другое окно переносится через B, оно также должно быть перенесено и через A;Ситуация, когда B скрыта и не видна, но отображается A, должна быть предотвращена

Я пытался реализовать это с помощью функции SetWindowPos, вызывая ее оболочку (определенную в A) из Bвот так:

    public void SetLocation(Point location, IntPtr UnderHandle)
    {
        SetWindowPos(Handle, HWND_TOPMOST, location.X, location.Y, Width, Height,
                             SetWindowPosFlags.DoNotActivate);

    }

(SetWindowPosFlags from pinvoke.net)

Результат удовлетворяет почти все мои потребности, кроме lst.

Что я тоже пробовал:

  • HWND_TOP: не выводит окно A поверх активного окна B;если быть более точным: сразу после вызова окно A выводится на передний план, но затем B переходит на передний план;на практике, когда B перемещается по строке заголовка и нажата кнопка мыши, над ним рисуется окно A - но оно проходит под моментом, когда кнопка мыши не нажата

  • , вызывая SetWindowPos с UnderHandle какпервый параметр и дескриптор как второй, при попытке «привести окно B под окно A» дает тот же результат

Как правильно использовать SetWindowPos для достижения желаемого результата - или, альтернативно, какМожно ли контролировать положение окна B в Zorder, чтобы заставить окно A в положение рядом с ним (из окна переднего плана)?

1 Ответ

2 голосов
/ 19 января 2012

Очевидно, HWND_TOPMOST - это ваша проблема, и вы определенно не должны этого делать.Вы можете использовать HWND_TOP, но тогда проблема заключается в том, как сохранить окно A поверх окна B. Способ сделать это - сделать A 100 * * владельцем владельцем B.

Владелец Windows

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

  • Собственное окно всегда находится над своим владельцем в z-порядке.
  • Система автоматически уничтожает собственное окно, когда его владелец уничтожается..
  • Собственное окно скрыто, когда его владелец свернут.

Окном владельца может быть только перекрывающееся или всплывающее окно;дочернее окно не может быть окном владельца.Приложение создает собственное окно, указав дескриптор окна владельца в качестве параметра hwndParent , равного CreateWindowEx, когда оно создает окно со стилем WS_OVERLAPPED или WS_POPUP.Параметр hwndParent должен идентифицировать перекрывающееся или всплывающее окно.Если hwndParent идентифицирует дочернее окно, система назначает владение родительскому окну верхнего уровня дочернего окна.После создания собственного окна приложение не может передать право владения этим окном другому.

Фактически, как видно из первого пункта выше, после правильной настройки владения нетнужно для HWND_TOP.

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