我有一个大型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任务栏。 如何阻止任务栏显示?
答案 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.Drawing
和System.Window.Forms
的引用。这里的使用并不是一个好主意,因为命名空间与来自.net的内容相冲突。