c# - WPF 中的 Windows 小工具 - 在激活 "Show desktop"时显示

标签 c# wpf windows-desktop-gadgets

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

  • 没有任务栏条目
  • 当您 alt+tab 窗口时不显示
  • 并不总是在最前面,应用程序可以在最前面
  • 执行“Aero Peek”时可见
  • 使用“显示桌面”/Windows+D 时可见

我已经能够完成前四个目标,但无法找到第五个问题的解决方案。我最接近的是使用 How do you do AppBar docking (to screen edge, like WinAmp) in WPF? 中的实用程序类,但这会将应用程序变成一个“工具栏”,从而将应用程序从屏幕上放置我的小工具 GUI 的部分中移除。

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

最佳答案

尝试将 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获取桌面窗口句柄
  • 使用 p/invoke 调用为 WndProc 设置回调
  • 处理 WM_ACTIVATE 或适当的窗口消息并将不透明度设置回 1

关于c# - WPF 中的 Windows 小工具 - 在激活 "Show desktop"时显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2405194/

相关文章:

javascript - 怎样对付邪恶呢?在 System.Shell.execute() 之前验证用户输入;

c# - 当 .Count() 大于零时从 .Select() 获取 NullReferenceException LINQ to XML

c# - 有没有办法在 LINQ 查询语法中使用 Distinct?

c# - WriteableBitmap(Ex) 与 DrawingContext 的性能对比

c# - 在 winforms 中,我可以将其中包含一堆控件(如列表框)的控件拖到另一个控件中并从那里调整大小/移动它们吗?

wpf - 在 WPF VirtualizingStackPanel 中滚动时内存泄漏

c# - 如何将两个不同的属性绑定(bind)到两个不同的数据上下文 WPF C#

javascript - 从 XMLHttpRequest 中提取单个元素

c# - WPF 将 ItemSource 绑定(bind)到数组中实例的属性

xmlhttprequest - Microsoft.XMLHTTP - 如何防止缓存?