Действительно раздражающая ошибка со свойством TopMost в Windows Forms

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

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

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

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

Править:
Я добавил часть кода для показа MessageBox когда TopMost свойство было изменено, чтобы видеть, мог ли я заметить странное поведение, но это было бесполезно. Это не помогло, потому что форма была с TopMost = true но это все еще было в фоновом режиме...

5
задан Ricardo Amaral 11 May 2010 в 13:57
поделиться

2 ответа

Существует не только одно окно "Topmost". Topmost просто говорит "Перед всеми не самыми верхними окнами".

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

В качестве обходного пути можно сбросить и снова установить это свойство при показе окна.

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

5
ответ дан 14 December 2019 в 13:29
поделиться

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

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

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

1
ответ дан 14 December 2019 в 13:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: