Window.Topmost = false не надежно останавливает поведение topmost - PullRequest
0 голосов
/ 25 февраля 2012

Я ищу способ обойти, как мне кажется, ошибку в WPF. Это наиболее упрощенный пример проблемы. Ясно, что в этом случае он побеждает цель Window.Topmost, но делает проблему очень ясной. При реализации System.Windows.Window:

    protected override void OnDeactivated(EventArgs e) {
        this.Topmost = false;
        base.OnDeactivated(e);
    }

Это не надежно помешает окну или его содержимому продолжать рисовать НАД другим, недавно активированным приложением. Например, если я щелкну в текстовой области Блокнота, Окно WPF будет рисовать поверх Блокнота. Если я щелкну вверху Блокнота (и это типично для большинства других приложений, которые я пробовал), мое окно WPF будет рисоваться до тех пор, пока не произойдет MOUSEUP, и только , если это произойдет достаточно скоро. Я могу многократно использовать MOUSEDOWN, и окно остается самым верхним, пока моя MOUSEUP не слишком быстро отстает от нее. Однако есть несколько ситуаций, в которых он надежно отстает, в зависимости от того, где я нажимаю в каком приложении, или если я нажимаю второе приложение, оно никогда не будет рисовать поверх этого.

Примечание. На практике я пытаюсь использовать прозрачное наложение, которое «прилипает» к форме окна. Таким образом, в этом случае он уже деактивируется в 99% случаев, когда пользователь взаимодействует с формой. Поскольку я не могу надежно отключить TopMost для окна, непрозрачные биты моего приложения продолжают плавать поверх других приложений. Принудительное отображение окна ничего не меняет.

Прикрепленный снимок экрана показывает, что ошибка не повторяется при нажатии второго приложения, но остается в верхней части первого окна (красные биты - из моего приложения).

Snapshot of Window sandwiched with Topmost==false

...