如何防止任务栏出现在WPF非全屏窗口中?

时间:2012-06-04 06:44:24

标签: wpf window command-line-interface

我有一个大型C ++代码库,本机Windows GUI全屏运行。 其中的一部分应通过其顶部显示的WPF窗口进行交换。 窗口设置如下:

<Window WindowState="Normal" 
        WindowStyle="None"
        ShowInTaskbar="False"
        AllowsTransparency="True"
/>

这将窗口无缝融合到应用程序的其余部分。 窗口的调用是从C ++ / CLI完成的,如下所示:

Windows::Window^ w = window();
Windows::Interop::WindowInteropHelper iHelp(w);
iHelp.Owner = System::IntPtr(_parentHwnd);
w->Show();

_parentHwnd是本机应用程序的HWND。 如上所述,应用程序始终显示为全屏。 当我现在单击WPF窗口时,将出现Windows任务栏。 如何阻止任务栏显示

2 个答案:

答案 0 :(得分:2)

我已经使用过这个类(在网上的某个地方找到了一个想法)来隐藏/显示任务栏:

public static class Taskbar
{
    [DllImport("user32.dll")]
    private static extern int FindWindow(string className, string windowText);
    [DllImport("user32.dll")]
    private static extern int ShowWindow(int hwnd, int command);

    private const int SW_HIDE = 0;
    private const int SW_SHOW = 1;

    public static int Handle
    {
        get
        {
            return FindWindow("Shell_TrayWnd", "");
        }
    }
    public static int StartHandle
    {
        get
        {
            return FindWindow("Button", "Start");
        }
    }

    public static void Show()
    {
        ShowWindow(Handle, SW_SHOW);
        ShowWindow(StartHandle, SW_SHOW);
    }

    public static void Hide()
    {
        ShowWindow(Handle, SW_HIDE);
        ShowWindow(StartHandle, SW_HIDE);
    }
}

适用于Windows XP / Vista / 7.

答案 1 :(得分:1)

使用Flot2011回答this我能够假装我的窗口属于另一个全屏窗口。对于那些对缺失部分感到好奇的人 - 这里是: 我们为激活和停用的事件实现处理程序

<Window
Activated="DisplayWindow_Activated"
Deactivated="DisplayWindow_Deactivated"
/>

事件处理程序看起来像这样

private void DisplayWindow_Activated(object sender, EventArgs e)
{
  var screen = System.Windows.Forms.Screen.FromRectangle(
    new System.Drawing.Rectangle(
      (int)this.Left, (int)this.Top,
      (int)this.Width, (int)this.Height));
  if( screen.Primary )
    Taskbar.Hide();
}

private void DisplayWindow_Deactivated(object sender, EventArgs e)
{
  var screen = System.Windows.Forms.Screen.FromRectangle(
    new System.Drawing.Rectangle(
      (int)this.Left, (int)this.Top,
      (int)this.Width, (int)this.Height));
  if( screen.Primary )
    Taskbar.Show();
}

那么现在发生了什么?任务栏将在主应用程序中消失,因为它是全屏的。当我点击覆盖的窗口时,任务栏将被激活,但由属性事件停用。因此,mashup就像一个全屏应用程序。

screen部分用于处理多显示器设置。如果(mashup)应用程序在主监视器上全屏显示,我们应该只隐藏任务栏。当前的解决方案假设WPF窗口和底层全屏应用程序在同一屏幕上。

如果您使用screen内容,请不要忘记包含对System.DrawingSystem.Window.Forms的引用。这里的使用并不是一个好主意,因为命名空间与来自.net的内容相冲突。