Захотелось поэкспериментировать с новым интерфейсом Windows 7, а конкретно решил убрать кнопку "Свернуть все окна" из трея. Зачем мне это надо - вопрос другой, здесь важна сама реализация. Кнопка "Свернуть все окна", как в сказке про Кащея, находится внутри нескольких других окон. Вложенность и иерархию классов можно определить, например, при помощи программы
WinDowzer или любой другой, показывающей дерево всех окон системы. Для поиска родительского окна системного трея с названием класса Shell_TrayWnd я использовал функцию
FindWindow, а для определения хэндлов вложенных дочерних окон с классами TrayNotifyWnd (область уведомлений) и TrayShowDesktopButtonWClass (сама кнопка "Свернуть все окна") - функцию
FindWindowEx.
...
; Найти окно трея
invoke FindWindow,stw,NULL
or eax,eax
jz no_button
; Найти окно уведомлений в трее
invoke FindWindowEx,eax,NULL,tnw,NULL
or eax,eax
jz no_button
; Найти кнопку "Свернуть все окна"
invoke FindWindowEx,eax,NULL,tsc,NULL
or eax,eax
jz no_button
; Спрятать кнопку "Свернуть все окна"
; Если надо показать кнопку, то замените флаг на SW_SHOW
invoke ShowWindow,eax,SW_HIDE
; Кнопка не найдена
no_button:
...
; Названия классов окон для поиска
stw db 'Shell_TrayWnd',0 ; Название класса окна трея
tnw db 'TrayNotifyWnd',0 ; Название класса окна области уведомлений
tsc db 'TrayShowDesktopButtonWClass',0 ; Название окна кнопки
К сожалению, мне не удалось полностью убрать кнопку из трея, даже когда она скрыта, на ее месте остается пустое пространство. Попытки изменить ширину кнопки перед ее скрытием при помощи функции
SetWindowPos успеха тоже не принесли.
В приложении примеры двух программ, реализующих описанный алгоритм. Одна скрывает кнопку "Свернуть все окна", другая возвращает ее на место. Программы работают, естественно, только под Windows 7.