Гаджет Windows в WPF - показывает, в то время как “Выставочный рабочий стол” активируется

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

  • Никакая запись панели задач
  • Не обнаруживается когда Вы alt+tab окна
  • НЕ поверх остальных окон, приложения могут быть на вершине
  • Видимый при выполнении 'Аэро Быстрого взгляда'
  • Видимый при использовании 'Выставочного рабочего стола' / Windows+D

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

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

15
задан Community 23 May 2017 в 11:54
поделиться

2 ответа

Попробуйте установить 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>

Я сделал это в C # для 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, чтобы получить дескриптор окна рабочего стола.
  • Использовать вызов ap / invoke, чтобы установить обратный вызов для WndProc.
  • Обработать WM_ACTIVATE или соответствующее сообщение окна и вернуть непрозрачность на 1
1
ответ дан 1 December 2019 в 05:31
поделиться

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

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

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

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

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

1
ответ дан 1 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: