Обновить (перерисовать) окно системного трея после удаления кнопки - PullRequest
0 голосов
/ 16 апреля 2019

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

Это эстетическая проблема, которую я хотел бы избежать. Я просто хотел бы программно обновлять / перерисовывать окно панели инструментов после отправки сообщения TB_DELETEBUTTON, однако после того, как я вызываю UpdateWindow , UpdateLayeredWindow или RedrawWindow , пустое прямоугольник удаленной кнопки остается там.

Сочетание флагов, которое я пытался использовать с RedrawWindow : RDW_FRAME, RDW_ALLCHILDREN, RDW_UPDATENOW и RDW_INVALIDATE, все вместе.

Дескриптор окна, который я передаю этим функциям, - это окно с именем класса: «ToolbarWindow32» (в котором находятся кнопки / значки приложений в системном трее), пример получения этого дескриптора окна можно найти здесь .

Мой вопрос: как я могу правильно обновить / перерисовать это окно?

1 Ответ

0 голосов
/ 17 апреля 2019

После вызова функции InvalidateRect я заметил, что окно области уведомлений перерисовывается (потому что окно мигает на мгновение), поэтому перерисовка окна не является правильным решением для решения этой проблемы ...

Однако в следующей теме я нашел решение:

Дело в том, что для «правильного» обновления размера области уведомлений, чтобы удалить все пустые места из ранее удаленных кнопок, мне просто нужно отправить WM_LBUTTONDOWN и WM_LBUTTONUP сообщения через функцию SendMessage .

Эти сообщения окна должны быть отправлены два раза (по крайней мере для Windows 10) в окно ToolbarWindow32 в следующем порядке: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDOWN, WM_LBUTTONUP. Это делается для того, чтобы воспроизвести два отдельных щелчка (а не двойной щелчок) на первой кнопке внутри панели задач, что мне и нужно было сделать вручную перед применением этого автоматизированного решения. После отправки сообщений окно становится «автоматически изменяемым».

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

Обратите внимание, что эта методология также работает, когда есть стрелка вверх, которая содержит "скрытые" кнопки.

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