Скрыть другую кнопку панели задач приложения
Я хотел бы иметь возможность скрыть другое окно приложения с панели задач, не скрывая самого окна. В частности, я хочу, чтобы несколько различных веб-браузеров работали, видимы, доступны в списке Alt + Tab, но не занимали место на панели задач.
(Если кому-то интересно, почему: я написал приложение панели мониторинга, которое использует API-интерфейсы Vista DwmRegisterThumbnail, чтобы показывать живые предварительные просмотры нескольких окон одновременно - своего рода "изображение на картинке", если хотите. В этот момент также наличие кнопок панели задач для этих окон кажется излишним.)
Мне известно, что смена другого стиля окна с включением WS_EX_TOOLWINDOW
скроет его из панели задач, и я попробовал это первым. Но, как и ожидалось, у него были некоторые побочные эффекты, которых я не хотел: заголовок был короче (не все плохо, я думаю), и кнопки с минимизацией и максимизацией исчезли (не хорошо). Мне также пришлось скрыть и повторно показать окно, чтобы панель задач распознала изменение, которое вызвало перекраску артефактов, когда я сделал это в IE-окнах.
Моя следующая мысль заключалась в том, что, поскольку окна с владельцами по умолчанию скрыты от панели задач, возможно, я мог бы изменить другие окна, которые будут принадлежать моей. Но MSDN довольно ясно, что "[a] fert создание собственного окна, приложение не может передать право собственности на окно в другое окно."
Я нашел этот вопрос, который был сформулирован так же, как и мой, но конкретно о окнах из вашего собственного процесса, где у вас есть полный контроль над владением окнами.
Кто-нибудь знает о других способах скрыть кнопку на панели задач, которая будет работать для окон из другого процесса?
Обновление: Tormod поставил меня на правильный путь с помощью ITaskbarList - он отлично работает. На странице pinvoke.net были некоторые ошибки (неправильный GUID, методы, объявленные в алфавитном порядке, а не в порядке интерфейса), но я его отредактировал, внесла исправления, а также добавил пример того, как создать экземпляр ITaskbarList через его класс.
Обновление 2: Если вы используете DeleteTab, чтобы скрыть кнопку панели задач окна, а затем сделайте это активное окно (например, через SetForegroundWindow
или Alt + Tab), его панель задач снова появится. Чтобы скрыть кнопку панели задач, мне пришлось добавить таймер и продолжить вызов DeleteTab. Пока вы не возражаете, кнопка кнопки панели появляется снова, когда окно фокусируется, это хорошо работает.
Ответы
Ответ 1
От MSDN:
Версия 4.71 и более поздняя версия Shell32.dll добавляет возможность изменять содержимое панели задач. Из приложения теперь вы можете добавлять, удалять и активировать кнопки панели задач. Активация элемента не активирует окно; он показывает элемент как нажатый на панели задач.
Возможности модификации панели задач реализованы в объекте Component Object Model (COM) (CLSID_TaskbarList), который предоставляет интерфейс ITaskbarList (IID_ITaskbarList). Вы должны вызвать метод ITaskbarList:: HrInit для инициализации объекта. Затем вы можете использовать методы интерфейса ITaskbarList для изменения содержимого панели задач.
Кажется, что COM-взаимодействие - это способ, чтобы надежно манипулировать содержимым панели задач. В частности, вам нужно будет вызвать следующие функции:
Вы можете найти подпись С# для интерфейса ITaskbarList в pinvoke.net: ITaskbarList.
Ответ 2
Вы пытались удалить WS_EX_APPWINDOW
?