Win7 WPF Alt + Tab焦点奇怪

时间:2009-12-18 19:31:24

标签: wpf xaml windows-7 alt-tab

经过几个小时的谷歌搜索后,我无法就此问题找到任何意见。我们有一个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测试应用程序神奇地重新出现
  6. 所以我的问题是:这是怎么回事?!这是预期的行为吗?如果是这样,有什么办法吗?

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

1 个答案:

答案 0 :(得分:1)

根据Spy ++,问题是使用WindowStyle =“None”设置的窗口在您使用alt-tab时不再接收WM_ACTIVATE消息。如果AllowTransparency =“True”正在禁用窗口的命中测试,那么当您点击蓝色矩形时,唯一返回true的HitTest就是桌面。

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

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


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