Я пишу собственное окно всплывающей подсказки (назовем его 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 в положение рядом с ним (из окна переднего плана)?