Скрыть кнопку панели задач другого приложения - PullRequest
14 голосов
/ 11 апреля 2009

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

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

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

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

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

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


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

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

Ответы [ 2 ]

5 голосов
/ 11 апреля 2009

С MSDN :

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

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

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

Подпись C # для интерфейса ITaskbarList находится по адресу pinvoke.net: ITaskbarList .

0 голосов
/ 11 апреля 2009

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

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