2009-04-11 5 views
13

Я хотел бы иметь возможность скрывать окно другого приложения на панели задач, не скрывая самого окна. В частности, я хочу, чтобы несколько различных веб-браузеров работали, видимы, доступны в списке Alt + Tab, но не занимали место на панели задач.Скрыть кнопку на панели задач другого приложения

(Если кому-то любопытно, почему: я написал приложение панели мониторинга, которое использует API DwmRegisterThumbnail API Vista, чтобы показывать живые предварительные просмотры нескольких окон одновременно - своего рода «картинка на картинке», если хотите. В этот момент, также имеет кнопки панели задач для этих окон, кажется избыточным.)

Я знаю, что изменение стиля другого окна, чтобы включить WS_EX_TOOLWINDOW, скроет его с панели задач, и я попробовал это первым. Но, как и ожидалось, у него были некоторые побочные эффекты, которых я не хотел: заголовок был короче (не все плохо, я думаю), и кнопки с минимизацией и максимизацией исчезли (не хорошо). Мне также пришлось скрыть и снова показать окно, чтобы панель задач распознала изменение, которое вызвало перекраску артефактов, когда я сделал это в IE-окнах.

Моя следующая мысль заключалась в том, что, поскольку окна с владельцами по умолчанию скрыты от панели задач, возможно, я мог бы изменить другие окна, которые будут принадлежать моей. Но MSDN - это pretty clear, что «[a] создать собственное окно, приложение не может передать право собственности на окно в другое окно».

Я нашел this question, который сформулирован так же, как и мой, но это касается окон вашего собственного процесса, где у вас есть полный контроль над владением окнами.

Кто-нибудь знает какие-либо другие способы скрыть кнопку на панели задач, которая будет работать для окон из другого процесса?


Update: Tormod поставил меня на правильный путь с ITaskbarList - он прекрасно работает. На странице pinvoke.net были некоторые ошибки (неправильный GUID, методы, объявленные в алфавитном порядке, а не в порядке интерфейса), но я отредактировал его, внесла исправления и также добавил пример того, как создать экземпляр ITaskbarList через свой класс.

Update 2: Если вы используете DeleteTab скрыть кнопку на панели задач оконном, а затем сделать что активное окно (например, с помощью SetForegroundWindow или Alt + Tab), ее кнопка на панели задач появится снова. Чтобы скрыть кнопку панели задач, мне пришлось добавить таймер и продолжить вызов DeleteTab. До тех пор, пока вы не возражаете, кнопка кнопки панели появляется снова, когда окно становится сфокусированным, это работает хорошо.

ответ

6

От MSDN:

Версия 4,71 и более поздней Shell32.dll добавляет возможность изменять содержимое панели задач. Из приложения теперь вы можете добавлять, удалять и активировать кнопки панели задач. Активация элемента не активирует окно; он показывает элемент как нажатый на панели задач.

Возможности модификации панели задач реализованы в объекте Component Object Model (COM) (CLSID_TaskbarList), который предоставляет интерфейс ITaskbarList (IID_ITaskbarList). Вы должны вызвать метод ITaskbarList :: HrInit для инициализации объекта. Затем вы можете использовать методы интерфейса ITaskbarList для изменения содержимого панели задач.

Кажется, что COM-взаимодействие - это способ, чтобы надежно управлять содержимым панели задач.В частности, вам нужно будет вызывать следующие функции:

Вы можете найти C# подпись для ITaskbarList интерфейса на pinvoke.net: ITaskbarList.

+0

Sweet - я никогда не знал об этом, но это звучит как билет. Благодаря! –

0

Вы пытались удалить WS_EX_APPWINDOW?

+0

Да, я сделал. Это работает только в том случае, если другое приложение должно было добавить WS_EX_APPWINDOW, в первую очередь, например. если у него есть окно владельца. Обычным окнам верхнего уровня не требуется 'WS_EX_APPWINDOW', поэтому его не нужно удалять. –

Смежные вопросы