2010-03-08 62 views
14

我正尝试使用WPF创建一个“小工具”,如应用程序。我们的目标是获得相同的行为作为一个正常的Windows 7的小工具:WPF中的Windows小工具 - 显示“显示桌面”时显示

  • 没有任务栏条目
  • 没有显示出来,当你ALT + TAB窗口
  • 并不总是在最前面,应用程序可以在最前面
  • 可见,同时执行“航空皮克”
  • 可见,而使用“显示桌面” /的Windows + d

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

我可以看到以前在Stackoverflow上有类似的问题,但是在找到解决方案之前,这些问题已经消失。希望现在有一个人在那里用知识来解决这个反正发布=)

回答

1

尝试朵蒙特设置为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拿到桌面窗口的句柄
  • 使用AP/Invoke调用设置回调WndProc中
  • 手柄WM_ACTIVATE或相应的Windows消息,并设置您的不透明度返回到1
+0

这实际上是有效的。 – Larry 2017-02-15 20:28:58

1

您可以通过创建XBAP来实现使用WPF的实际Windows小工具。只需添加一个gadget.xml文件和一个仅包含加载XBAP的IFRAME的.html文件即可。这样你的WPF应用程序实际上就是一个小工具,并且会自动遵循所有的规则。

另一种选择是使用Windows Sidebar Styler。这需要与您一起安装附加软件,但也允许您在没有代码签名证书,用户授权等的情况下执行XBAP沙箱内无法执行的操作。

第三个选项是创建一个小工具,可以在HTML中识别(例如特定的背景颜色),然后当您的.exe启动时,扫描具有您正在查找的属性的资源管理器下的hWnd,将自己注入Explorer.exe进程,并将窗口设置为它的一个孩子。

第三个选项的变体是不注入Explorer.exe,而是维护您的Z索引和位置(使用SetWindowPos)来跟踪Z索引和您找到的hWnd的位置。

那么多的选择...

0

一个解决方案,以实现做“小工具”之类的行为,就是让你的窗口桌面的孩子。这样,即使按Windows + D,您的窗口也始终可以在桌面上看到。 你可以在这里看到它是如何完成的:Window "on desktop"