Гаджет 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. Вы можете увидеть, как это делается здесь: Окно "на рабочем столе" .