问题标签 [dwm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
8665 浏览

delphi - Delphi 对 Aero Glass 和 DoubleBuffered 属性的支持 - 发生了什么以及我们如何使用它们?

我对 Delphi 2009/2010 对 Windows 中 Aero Theme Glass 功能的支持、DoubleBuffered 的确切含义以及它与 Aero glass 的关系感到困惑。我发现 DoubleBuffered 不仅是 VCL 中的一个属性,它也可以在.net WinForms中找到。最初我想知道它是否设置了公共控件库使用的某种窗口样式位,或者什么。为什么使用它,何时使用?

[更新:我应该声明我知道什么是“双缓冲”,作为一种减少闪烁的通用技术,我想知道的是,为什么它与 Windows Vista 中 Aero Glass 窗格上的渲染控件有任何关系/ Windows 7,特别是为什么所有事物的 BUTTON 都需要将双缓冲设置为 true,才能在玻璃上工作?下面链接的博客文章似乎信息量最大。]

尤其是对DoubleBuffered属性很困惑,想知道它为什么存在,它的玻璃支架和窗体、控件中的双缓冲属性是什么关系。当您阅读像这样的 C++ 文章时,您会发现没有提到双缓冲。

[更新2:以下内容包含一些事实错误,并已进行修改:]

我发现一些 C++ 开发人员谈论他们如何调用 SetLayeredWindowAttributes 以避免在经典 Win32 应用程序中打开 DWM/Aero 合成导致的“黑色变成玻璃”故障 [但是下面的博客链接告诉我这不再有效在 Windows 7 中,实际上只是在 Vista 中短暂工作,直到微软阻止它]。[Begin WRONG Idea] 我们不应该使用其他颜色,比如明亮的洋红色,然后把它变成玻璃透明色吗?[结束错误的想法]

什么时候应该设置和不设置 DoubleBuffered 的规则是什么,为什么首先将 DoubleBuffered 添加到 VCL 中?什么时候设置会出问题?(似乎远程桌面是一种情况,但这是唯一的情况吗?)当它没有设置时,我们会在按钮文本的渲染中出现故障,很可能是因为 Delphi 似乎没有更改默认的“将黑色渲染为玻璃“在 Aero DWM 中。

在我看来,Aero Glass 渲染从根本上是以一种奇怪或难以理解的方式完成的[由 Windows 本身,而不是仅包装此功能的 Delphi],并且 2009/2010 年的许多内部 VCL 源代码StdCtrls 中的类必须做很多复杂的逻辑才能在 Aero Glass 上正确渲染东西,但它仍然有很多问题,在我看来它做错了,这可能是这个相关问题和 qc 问题的背后。 [更新 3:玻璃上的许多渲染故障,在 VCL 中,在通用控件中渲染完成错误,微软似乎并不关心修复。简而言之,Delphi VCL 代码修复无法解决这样一个事实,即古老的 Windows 通用控件库和现代 [但古怪的] Aero Glass 合成功能彼此不太喜欢,并且不能很好地协同工作。感谢 Microsoft 构建了如此高质量的技术并将其释放到世界各地。]

如果还不够有趣;为什么我们有 ParentDoubleBuffered?

[7 月 30 日更新:这个问题对我来说很有趣,因为我认为它表明,当你有一个大型的现有 VCL 框架时,使用 Windows API 来解决这个问题是一个难题。]

0 投票
0 回答
1109 浏览

windows-7 - 闪烁的 UI 问题 - 是什么导致 Windows 7 中的 DWM 在调用 SetWindowPos 时决定立即刷新?

我有一个自定义选项卡样式控件,它在内部通过单击选项卡时显示或隐藏相关页面来工作。

单击选项卡时发生的事情的基本顺序是

  1. 将相关页面放在前面
  2. 显示相关页面(通过使用适当的标志调用 SetWindowPos)
  3. 隐藏我们刚刚掩盖的旧页面
  4. 重新粉刷窗户

我的一些标签是用 DirectX 渲染的。在 Windows XP 下,一切正常,在选项卡之间切换时没有闪烁。但在 Windows 7(或 Vista)下,第 2 步中对 SetWindowPos 的调用会重绘窗口,并且在第 4 步之前会有未初始化的像素闪烁,通常是在我的应用程序开始运行之前桌面上的任何内容。

这只发生在 DirectX 页面上,但我不确定 DirectX 是什么导致了这种情况,如果有的话 - 页面之间还有其他差异,这只是明显的模式。我不确定这是真正的线索还是红鲱鱼。

GDI 页面直到第 4 步才会重新绘制。我逐步检查了代码并检查了 - 这不仅仅是 DWM 在第 2 步中使用了正确缓存的位图 - 它实际上直到第 4 步才重新绘制。

这是背景信息,但目前我不确定如何解决这个特定问题,所以我的问题更笼统:

有哪些因素会影响 SetWindowPos 决定是否重绘?

0 投票
2 回答
6451 浏览

c# - Windows窗体玻璃效果,使ImageBox透明

我有一个 Windows 窗体应用程序,我已经使用 DwmExtendFrameIntoClientArea 将窗口的框架扩展到客户区域以获得玻璃效果。

现在我试图在图片框中显示一个透明的 PNG 图像,但是背景显示为白色而不是玻璃效果。如何使图像显示为透明,以便我只看到圆角灰色矩形而不是白色背景。

我的截图如下。谢谢。

替代文字

替代文字

0 投票
3 回答
7683 浏览

winapi - Vista/7:如何获得玻璃颜色?

你怎么用DwmGetColorizationColor

文档说它返回两个值:

  • 0xAARRGGBB包含用于玻璃成分的颜色的 32 位
  • 一个布尔参数,“如果颜色是不透明的混合”,则为真(无论这意味着什么

这是我喜欢的颜色,漂亮的呕吐绿色: 替代文字

你可以注意到颜色是绿色的,半透明的标题栏(白色背景)非常清楚地显示鼻涕颜色: 在此处输入图像描述

我尝试从 Windows 获取颜色:

我得到

根据文档,此值的格式为AARRGGBB,因此包含:

据推测,这意味着颜色为 (10, 15, 4),不透明度约为 5.1%。

但如果你真的看这个 RGB 值,它与我想要的鼻涕绿色相去甚远。这是

  • (10, 15, 4) 不透明度为零(原始颜色),以及
  • (10,15,4),白色/棋盘背景不透明度为 5%:

替代文字

不是Lime绿色,而是DwmGetColorizationColor返回几乎完全透明的黑色

所以问题是:如何在 Windows Vista/7 中获得玻璃颜色?

我尝试使用DwmGetColorizationColor,但效果不是很好。


一个有同样问题的人,但是一张更好的闪亮图片来吸引你的松鼠: 替代文字

因此,它归结为 - DwmGetColorizationColor 对于试图将当前颜色应用到不透明表面的应用程序完全不可用。


我比我更喜欢这家伙的截图。以他的截图为模板,我又制作了一些闪闪发光的东西:

替代文字

替代文字

替代文字

替代文字

替代文字

替代文字

对于最后两个屏幕截图,alpha 混合芯片是真正的部分透明 PNG,与浏览器的背景混合。凉爽的!(我真是个极客)

编辑 2:必须以彩虹色排列它们。(我真是个极客)

编辑 3:现在我当然要添加黄色。


未记录/不受支持/脆弱的解决方法

在入口点 137 处有一个未记录的导出DwmApi.dll,我们称之为DwmGetColorizationParameters

我们对第一个参数感兴趣:ColorizationColor.

我们还可以从注册表中读取值:

因此,您选择创建 appcompat 问题的毒药。你可以

也可以看看


一年多来,我一直想问这个问题。我一直都知道这是不可能回答的,而让任何人真正关注的唯一方法就是拥有彩色截图;开发人员被闪亮的东西所吸引。但不利的一面是,这意味着我必须投入各种工作来制作诱饵。

0 投票
1 回答
1639 浏览

windows - 何时使用 DwmExtendFrameIntoClientArea?

众所周知,一些现代应用程序(IE9、Firefox 4、Chrome、Paint.NET 等)使用 DwmExtendFrameIntoClientArea 来实现 Aero 玻璃效果。

但是,您真正应该将它用于什么类型的应用程序?对于浏览器,我可以理解尽可能多地减少无关空间,但实际上,有什么意义呢?为什么不直接创建没有框架的窗口(就像没有 DWM 时 Google Chrome 所做的那样)?我只是在寻找一些关于什么类型的应用程序应该使用这种效果以及何时使用的粗略指南。

0 投票
1 回答
2229 浏览

dwm - 如何使 dwmapi(桌面 Windows 管理器 API)在 Windows XP 中工作?

我正在使用 C# 上的 dwmapi.dll 做一个 Windows 应用程序,但它在 Windows XP 中不起作用,因为 XP 不支持桌面 Windows 管理器 API (dwmapi.dll)。它仅在 Vista 和 Win 7 中受支持。有人知道如何使 dwmapi(桌面 Windows 管理器 API)在 Windows XP 中工作吗?

谢谢,杰伦

0 投票
1 回答
2271 浏览

aero - “创建类似 Flip3D 的应用程序”的 API 是什么

我试图弄清楚如何使用 DWM 将 Window 的副本渲染到我自己想要的位置。我能找到告诉 DWM 在某处渲染的唯一方法是使用缩略图 API。

但是 MSDN 的DWM Thumbnail Overview他们特别警告我:

注意 DWM 缩略图不允许开发人员创建类似于 Windows Vista Flip3D (WINKEY-TAB) 功能的应用程序。缩略图直接以二维形式呈现到目标窗口。

有人告诉我缩略图api不能用来创建像Flip3D这样的应用程序,但是他们没有说哪个api可以用来创建像Windows Flip3D这样的应用程序。

那么什么 API可以用来创建像 Windows Vista Flip3D 这样的应用程序呢?


背景

随着 Windows 桌面组合的运行,应用程序将它们的窗口客户区绘制到它们自己的私有缓冲区上。(这与每个应用程序直接在屏幕上绘制的以前版本的 Windows 形成对比)。然后将此客户区图像放置在一个框架中(标题栏、最小化、最大化、恢复按钮等),然后绘制(即合成)到桌面上 - 以及所有其他打开的窗口:

替代文字

因为这个缓冲区是私有的,而且由于过去几年显卡在执行 3D 任务方面变得强大,Windows 可以开始执行一些巧妙的技巧。其中之一是能够操纵客户端窗口,对其执行缩放和透视更改。这允许实时“缩略图”api - Windows 将在其中绘制您告诉它的窗口的缩略图大小的副本。由于这一切都发生在硬件中,因此速度非常快。

另一个功能是 Flip3D(Win+Tab)。合成器可以执行窗口的 3d 定位。同样,因为这一切都是在硬件中完成的,所以速度非常快。

我找到了告诉桌面窗口监视器在“此处”为我绘制应用程序缩略图的 API:

但是我找不到 API 来告诉 DWM 为我绘制全尺寸版本的窗口。


编辑你不能责怪微软在 Windows 中的复制保护存档

  • 出厂的许可产品应符合合规规则,并且其设计和制造方式应明确旨在有效 阻止修改此类许可产品以违反 HDCP 规范和合规规则的内容保护要求的尝试。

  • 许可产品的设计和制造方式应明确旨在有效阻止发现或泄露设备密钥或其他高度机密信息的尝试

  • 许可产品应至少使用以下技术,其设计方式明确旨在有效挫败违反HDCP 规范和合规规则的内容保护要求的企图

你必须责怪索尼。

0 投票
1 回答
600 浏览

wpf - 没有阴影的 WPF Aero 窗口

我知道以下问题: 我想禁用特定航空窗上的阴影效果

但是,我仍然需要 Aero 窗口后面的 DWM 模糊/反射,所以我无法创建自定义透明的。我将如何处理?我可以自己处理反射,但我不知道如何创建模糊。

0 投票
1 回答
927 浏览

wpf - WPF 和 DWM 用于通过网络重定向输出

我正在编写一个大型 WPF 应用程序(与屏幕资源一样大),运行一些基本控件、基本视频播放等......

我一直在研究如何通过本地网络将 WPF 窗口广播/重定向到其他监视器。本质上,尝试在单独的监视器上实时显示 WPF 应用程序的选定区域。

我一直在阅读有关 DWM(我没有经验)的信息,并且缩略图 API 似乎是实现此目的的好方法。只需通过某种多播网络广播在网络上广播片段(比如 9、300x300 片段),客户端 PC 会监听并渲染......

这可以做到吗?一个人将如何去做这样的事情?

编辑

我一直在对 DWM 进行更多阅读,似乎确实可以实现这一点,链接解释说:

您可以对 3D 场景进行分布式渲染,并使其在任意数量的客户端计算机上以全硬件加速运行。这种架构允许 DWM 为远程桌面场景提供一流的支持

我只是不知道从哪里开始研究这种发展......有什么想法吗?

0 投票
4 回答
6989 浏览

delphi - Delphi 玻璃上的 Google Chrome 样式标签

我正在尝试在 Delphi 应用程序中实现 Windows 7 中的 Google Chrome 样式选项卡。

这其中的要素是:

  • 选项卡可能会像在 google chrome 本身中那样延伸到非客户区。
  • 启用 glass 时在 Vista 和 Windows 7 上正确绘制
  • 标签就像谷歌浏览器一样工作,看起来像谷歌浏览器,在玻璃上。

在此处输入图像描述

我发现我必须克服的挑战是:

  • 如何让控件(VCL 控件)扩展到非客户区?(执行此操作的控件的一个很好的示例是 VCL 源中包含的 Ribbon 控件,但我还没有看到其他人这样做,并且需要一些邪恶的黑客才能使 Ribbon 起作用)
  • 如何在玻璃上正确绘制位图?(DWM API)。一个相关的问题已经回答了这个方面,在这里,我也问了这个问题。