Действительно раздражает ошибку с самой верхней собственностью в формах Windows

StackOverflow https://stackoverflow.com/questions/2777732

Вопрос

У меня есть это окна формы приложения, где он сидит в зоне уведомления. Нажав на значок, приносит его спереди, снова щелкнув его (или нажав на значок приложения X) отправляет его обратно. Это тип приложения, имеющего окно сверху, важно, когда он отображается, нажав на значок (хотя это необязательно).

Щелкнув правой кнопкой мыши значок приносит контекстное меню, в котором можно выбрать, чтобы включить опцию «Всегда в верхней части» или нет. Когда приложение впервые запускается, настройки приложения считаются из файла XML, и мне 99%, что это работает так, как он должен, TopMost Собственность правильно прочитана (и написана).

Через некоторое время (минуты, часы, дни, что угодно; я обычно зимует и редко отключить) TopMost перестает работать. Отказ Я не изменяю опцию, я не думаю, что что-то изменяет значение опции, но я нажимаю значок области уведомления, а приложение не поднимается спереди. Это отображается, но он на заднем плане (он отображает на Alt + Tab), это не «всегда сверху», как следует. Я поднимаю контекстное меню, отключите опцию (потому что он включен) и включите его обратно, и он начинает работать после этого. Приложение сейчас «всегда на вершине». Однако он может потерять эту способность в любое время через некоторое время.

Я не могу понять, почему это происходит и как это происходит. У кого-нибудь есть идеи почему? Если нет, какая-то идея, как я могу попытаться отладить такое поведение?

РЕДАКТИРОВАТЬ:
Я добавил кусок кода, чтобы показать сообщение Message, когда TopMost Собственность была изменена, чтобы увидеть, могу ли я заметить любое странное поведение, но это не было хорошим. Это не помогло, потому что форма была с TopMost = true Но это все еще было на заднем плане ...

Это было полезно?

Решение

Существует не только одно «верхнее» окно. Самое главное только говорит «перед всеми незапущенными окнами».

Я почти уверен, что ринитикализация рабочего стола (например, когда в гиберье) требуется другой SetWindowPos(hwnd, HWND_TOPMOST, ...) (который является базовым вызовом API Win32).

Как обходной путь, вы можете сбросить и установить свойство снова при отображении окна.

Другая возможность состоит в том, что скрытие окна также меняет Z порядок - либо топливо, как Win32 реализует, что или явно в пути WinForms вызова окна Hide / Show.

Другие советы

Как и Петерчен, у меня также нет подсказки, как получить корневую причину. Но почему бы не сделать это немного проще?

Когда вы нажимаете на свой значок, вы отображете свое окно и полагайтесь, что самого верхнее активное. Почему бы не звонить SetWindowPos() с текущей настройкой прямо перед появлением окна. Это не должно делать какие-либо проблемы с производительностью (произошедшется только в том случае, если пользователь нажимает на значок), ни любой другой побочный эффект.

Я знаю, было бы здорово выяснить корневую причину, но, возможно, это не стоит, если вы сможете решить это с таким небольшим обстоянием.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top