Гаджет Windows в WPF - показывать, пока активна «Показать рабочий стол» - PullRequest
14 голосов
/ 09 марта 2010

Я пытаюсь создать приложение, похожее на гаджет, с использованием WPF.Цель состоит в том, чтобы получить то же поведение, что и в обычном гаджете Windows 7:

  • Нет записи панели задач
  • Не отображается, когда вы нажимаете Alt + Tab Windows
  • Не всегда сверху, приложения могут быть сверху
  • Видимо при выполнении «Aero Peek»
  • Видимо при использовании «Показать рабочий стол» / Windows + D

Я смог достичь первых четырех целей, но не смог найти решение пятой проблемы.Самое близкое, что я получил, - это использование служебного класса из Как вы делаете стыковку AppBar (к краю экрана, как WinAmp) в WPF? , но это превращает приложение в «панель инструментов», тем самым изгоняяприложения из той части экрана, где размещен мой графический интерфейс гаджета.

Я вижу, что подобные вопросы уже задавались ранее в Stackoverflow, но они исчезли до того, как было найдено решение.В любом случае опубликовать в надежде, что есть кто-то, кто знает, как решить эту проблему =)

Ответы [ 3 ]

1 голос
/ 11 марта 2010

Реальный гаджет Windows можно реализовать с помощью WPF, создав XBAP. Просто добавьте файл gadget.xml и файл .html, который содержит только IFRAME, который загружает XBAP. Таким образом, ваше приложение WPF будет на самом деле гаджетом и будет автоматически следовать всем правилам.

Другой вариант - использовать Windows Sidebar Styler . Это требует установки дополнительного программного обеспечения вместе с вашим, но также позволяет вам делать вещи, которые вы не можете делать внутри изолированной программной среды XBAP, без сертификатов подписи кода, авторизации пользователя и т. Д.

Третий вариант - создать гаджет, который использует что-то узнаваемое в HTML (например, определенный цвет фона), затем при запуске .exe отсканируйте hWnd в проводнике, который имеет нужные вам атрибуты, впрысните себя в процесс Explorer.exe и установите свое окно как дочернее для него.

Вариант третьего варианта - не вводить в Explorer.exe, а сохранять Z-индекс и местоположение (используя SetWindowPos), чтобы отслеживать Z-индекс и местоположение найденного вами hWnd.

Так много вариантов ...

1 голос
/ 11 марта 2010

Попробуйте установить для Topmost значение true, и когда ваше приложение потеряет фокус, вы можете установить непрозрачность на 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>

Я сделал это в C # для окна:

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 и установите непрозрачность обратно на 1
0 голосов
/ 23 апреля 2011

Одним из решений для достижения поведения, подобного «гаджету», является создание окна в качестве дочернего элемента рабочего стола. Таким образом, ваше окно всегда отображается на рабочем столе, даже если вы нажимаете Windows + D. Вы можете увидеть, как это делается здесь: Окно «на рабочем столе» .

...