WPF中的Windows小工具 - 激活"显示桌面"时显示

Jan*_*ick 15 c# wpf windows-desktop-gadgets

我正在尝试使用WPF创建一个类似应用程序的"小工具".目标是获得与普通Windows 7小工具相同的行为:

  • 没有任务栏条目
  • 当您使用alt +标签窗口时不会显示
  • 并不总是在顶部,应用程序可以在顶部
  • 在表演'Aero Peek'时可见
  • 使用"显示桌面"/ Windows + D时可见

我已经能够完成前四个目标,但一直无法找到第五个问题的解决方案.我最接近的是使用如何在WPF中进行AppBar对接(到屏幕边缘,如WinAmp)的实用程序类,但这会将应用程序变成一个"工具栏",从而从我放置小工具GUI的屏幕部分中消除应用程序.

我可以看到之前在Stackoverflow上已经提出了类似的问题,但是在找到解决方案之前已经消失了.无论如何发帖,希望现在有人知道要解决这个问题=)

jon*_*ers 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>
Run Code Online (Sandbox Code Playgroud)

我在 C# 中为 Window 执行了此操作:

protected override void OnActivated(EventArgs e)
{
    base.OnActivated(e);

    Opacity = 1;
}

protected override void OnDeactivated(EventArgs e)
{
    base.OnDeactivated(e);

    Opacity = 0;
}
Run Code Online (Sandbox Code Playgroud)

这让你已经成功了;您需要一种方法来知道桌面是否获得焦点。

我打赌您可以通过连接桌面窗口的 WndProc 事件并查找 WM_ACTIVATE 来做到这一点。

你可以:

  • 调用GetDesktopWindow获取桌面窗口句柄
  • 使用 ap/invoke 调用为 WndProc 设置回调
  • 处理 WM_ACTIVATE 或适当的 Windows 消息并将不透明度设置回 1