Гаджет Windows в WPF - показывается, пока активирован "Показать рабочий стол"
Я пытаюсь создать приложение "gadget", подобное использованию WPF. Цель состоит в том, чтобы получить такое же поведение, как обычный гаджет Windows 7:
- Нет записи панели задач
- Не отображается, когда вы используете кнопки alt + tab
- НЕ всегда сверху, приложения могут быть сверху
- Видно при выполнении "Aero Peek"
- Видимый при использовании "Показать рабочий стол" /Windows + D
Я смог выполнить первые четыре цели, но не смог найти решение пятой проблемы. Самое близкое, что я пришел, - это использовать класс утилиты из Как вы делаете стыковку AppBar (к краю экрана, например WinAmp) в WPF?, но это превращает приложение в "панель инструментов", тем самым исключая приложения со стороны экрана, где размещается мой графический интерфейс гаджета.
Я вижу, что подобные вопросы были заданы ранее в Stackoverflow, но они вымерли до того, как было найдено решение. Проводка в любом случае в надежде, что теперь есть кто-то там со знанием, чтобы решить эту проблему =)
Ответы
Ответ 1
Попробуйте установить Topmost на true, и когда ваше приложение потеряет фокус, вы можете установить Opacity на 0.
Я сделал это Xaml:
<Window x:Class="OpacTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Topmost="True" Background="Transparent" ShowInTaskbar="False" AllowsTransparency="True" WindowStyle="None" Width="400" Height="300">
<Grid>
<Border Background="Black" CornerRadius="5" />
</Grid>
</Window>
Я сделал это в С# для окна:
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
Opacity = 1;
}
protected override void OnDeactivated(EventArgs e)
{
base.OnDeactivated(e);
Opacity = 0;
}
Это дает вам часть пути; вам нужен способ узнать, фокусируется ли рабочий стол.
Бьюсь об заклад, вы можете сделать это, подключившись к событию WndProc окна рабочего стола и поиская WM_ACTIVATE.
Вы можете:
- Вызовите GetDesktopWindow, чтобы получить дескриптор окна рабочего стола.
- Используйте вызов p/invoke для установки обратного вызова для WndProc
- Обработайте WM_ACTIVATE или соответствующее сообщение Windows и установите Opacity обратно на 1
Ответ 2
Вы можете реализовать фактический гаджет Windows, используя WPF, создав XBAP. Просто добавьте файл gadget.xml и .html файл, содержащий только IFRAME, который загружает XBAP. Таким образом, ваше приложение WPF будет на самом деле гаджетом и будет автоматически следовать всем правилам.
Другой вариант - использовать Windows Sidebar Styler. Это требует дополнительного программного обеспечения для установки рядом с вашим, но также позволяет делать то, что вы не можете сделать в изолированной среде XBAP без сертификатов подписи кода, авторизации пользователя и т.д.
Третий вариант - создать гаджет, который использует что-то узнаваемое в HTML (например, определенный цвет фона), а затем, когда ваш .exe запускается, отсканируйте hWnd в Проводнике, у которого есть атрибуты, которые вы ищете, вставьте себя в процесс Explorer.exe и установите свое окно в качестве дочернего элемента.
Вариант третьего варианта состоит в том, чтобы не вводить в Explorer.exe, а поддерживать свой индекс Z и местоположение (используя SetWindowPos) для отслеживания индекса Z и местоположения найденного вами hWnd.
Так много вариантов...
Ответ 3
Одним из решений для достижения "гаджета", такого как поведение, является сделать ваше окно дочерним по отношению к рабочему столу. Таким образом, ваше окно всегда отображается на рабочем столе, даже если вы нажмете Windows + D.
Вы можете увидеть, как это делается здесь: Окно "на рабочем столе" .