65.9K
CodeProject 正在变化。 阅读更多。
Home

隐藏 Windows Vista 标题栏中的标题和图标

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.15/5 (13投票s)

2007年4月28日

2分钟阅读

viewsIcon

86203

downloadIcon

1215

防止标题和图标出现在标题栏中,但仍出现在任务栏中,类似于 Windows 资源管理器

Screenshot - hide.png

引言

您是否注意到在 Windows 资源管理器(我的电脑)中,标题(标题栏文本)和图标没有显示? 是否想过如何在您的程序中实现它?
本指南将向您展示如何操作。

背景

假设您稍微扩展了玻璃效果(如示例中所示),然后在那里放置了更大、更容易阅读的标题,或者更确切地说是一个徽标。 或者,像在资源管理器中一样,您将通常在标题中显示的内容放在稍微靠下的位置。 例如,这与上图相同,但标题可见

Screenshot - nohide.png

这看起来有点毫无意义,不是吗? 您甚至可以说它看起来非常不专业。 好吧,Vista 具有一些功能,使您可以隐藏标题和图标,使用这些功能最好的地方是标题仍然会出现在底部的任务栏中。 如果您尝试通过清空.Text属性来删除它,标题将从任务栏中消失,这将导致混淆。

使用代码

不幸的是,在托管代码中无法设置我们想要的属性,因此我们必须调用本机“非托管”代码来隐藏它。 幸运的是,它并不难移植,而且效果很好。 要使用它,您必须首先填写一个WTA_OPTIONS结构,其中包含您要删除的内容,然后您必须调用该函数。

DWM.WTA_OPTIONS ops = new DWM.WTA_OPTIONS();
// We Want To Hide the Caption and the Icon
ops.Flags = DWM.WTNCA_NODRAWCAPTION | DWM.WTNCA_NODRAWICON;
// If we set the Mask to the same value as the Flags, the Flags are Added. 
// If not they are Removed
ops.Mask = DWM.WTNCA_NODRAWCAPTION | DWM.WTNCA_NODRAWICON;
// Set It, The Marshal.Sizeof() stuff is to get the right size of the 
// custom struct, and in UINT/DWORD Form
DWM.SetWindowThemeAttribute(this.Handle,
    DWM.WindowThemeAttributeType.WTA_NONCLIENT,
        ref ops,
        (uint)Marshal.SizeOf(typeof(DWM.WTA_OPTIONS)
); 

我在代码中提供了 Microsoft 记录的全部四个标志,尽管您可能只使用前两个。 如果您不理解这行代码

(uint)Marshal.SizeOf(typeof(DWM.WTA_OPTIONS) 

不用担心,它只是为了获取结构体的正确内存大小。 即使您更改了标志,您也永远不需要更改它。

关注点

编写此代码帮助我意识到在 C# 中使用本机代码是多么容易。 找到要使用的函数花费的时间比编写它要长得多!

到处都有uint,它是 C# 中最接近DWORD的类型,文档将其指定为顶部。

由于某种原因,Microsoft 将AttributeType定义为枚举,尽管目前只有一个值WTA_NONCLIENT1。 我将其保留为枚举,以与本机代码保持一致。

在下载中,我还包含了 DWM 代码来扩展边距,因为它与此配合良好,而且并不难做到。 我没有编写它,但在许多站点上都看到了它,所以我记不起该感谢谁了。 抱歉!

历史

  • 1.0 - 首次修订
© . All rights reserved.