2

经过几个小时的谷歌搜索后,我无法找到有关此问题的任何评论。我们有一个WindowStyle=None透明背景的窗口,允许透明并且不显示在任务栏中,这一切都很正常。这是 XAML,因此您可以自己测试:

<Window x:Class="AltTabTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="TestWindow" Title="TestWindow"
WindowStyle="None" AllowsTransparency="True" ResizeMode="NoResize" 
Background="Transparent" ShowInTaskbar="False"
Width="816" Height="820">

<Grid>
    <Border BorderThickness="0" Background="LightBlue" CornerRadius="15" />
</Grid>

现在奇怪的是,一旦您编译并运行此窗口,请按照以下步骤操作:

  1. 单击显示桌面以隐藏所有应用程序
  2. Alt+Tab 返回 WPF 测试应用
  3. 单击浅蓝色边框区域外部(到桌面工作区)
  4. 观察 WPF 测试应用程序神奇地消失
  5. 可选择 Alt+Tab 到任何其他正在运行的应用程序,并观察 WPF 测试应用程序神奇地重新出现

所以我的问题是:这到底是怎么回事?!这是预期的行为吗?如果是这样,有什么办法可以解决吗?

在解决 Alt+Tab 之后,感觉 WPF 应用程序并没有真正获得焦点。请注意,这是在 Windows 7 中测试的,我还没有能力在 Vista 或 XP 中进行测试。我想要一种强制应用程序真正获得焦点的方法,但如果这不可能,那么我想知道是否有办法捕获和忽略 Alt+Tab 操作。旨在修复的应用程序是锁定模式应用程序,因此用户永远无法真正摆脱在桌面上运行的应用程序。任何建议、示例、见解或正确方向的观点将不胜感激,谢谢!=)

4

1 回答 1

1

根据 Spy++ 的问题是,当您使用 WindowStyle="None" 设置窗口时,当您对它进行 alt-tab 时,它不再接收 WM_ACTIVATE 消息。让 AllowsTransparency="True" 禁用窗口的命中测试,因此当您单击蓝色矩形之外的唯一 HitTest 返回 true 是桌面的。

因为 WM_ACTIVATE 从未被触发,所以 MinimizeAllWindowsToDesktop 无法识别任何活动窗口,因此当它收到您在桌面上单击的通知时,桌面正在呈现,就像它没有激活任何窗口并且您正在桌面上做一些工作一样(此功能的预期行为)。

我不知道为什么在 Win7 中窗口没有收到 WM_ACTIVATE 消息。


编辑: 没关系,这看起来只是 WPF 和 Windows 7 中的一个错误。无论窗口的设置如何,这种行为都会持续存在。

于 2009-12-19T01:26:10.760 回答