问题标签 [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.
c# - 如何在 C# 中获取窗口的缩略图?
您如何获取窗口的缩略图,例如 Windows 7 超级栏预览或 Aero 翻转?请注意,我不想要应用程序的屏幕截图,DWM 中有一种方法可以获取此信息。
我想要一种 C# 方式来做到这一点。
谢谢
colors - Windows 如何改变 Aero Glass 的颜色?
我正在使用 Windows 7 RTM,我想知道控制面板如何能够如此顺利地更新 Aero Glass 颜色,而无需重新启动 DWM (uxsms)。DwmSetColorizationColor 不再工作了......
gdi - DWM 组合切换导致客户区丢失 alpha
我在这里有一个简单的 Windows 应用程序:
http://www.bengoodger.com/software/chrome/dwm/app.cc
我的应用程序在 DWM 合成处于活动状态时提供了一个自定义的玻璃框架,并在它处于非活动状态或不可用时提供了一个完全自定义的框架。
“自定义玻璃框架”由一个放大的标题栏区域组成,我的 WM _
NCCALCSIZE 实现将其报告为客户区域的一部分,因为我想在其中呈现透明控件。为了使我的窗口的这个“高标题栏区域”部分是透明的,我用透明的黑色填充它(在上面的简单示例中为 BLACK_BRUSH),这导致它被 DWM 绘制为玻璃。
当系统 DWM 被切换时,例如通过使用外观设置控制面板切换到 Vista Basic 或 Windows Standard,或者当启动需要系统禁用 DWM 的应用程序时,我的应用程序通过处理 WM_NCPAINT 等切换到完全自定义渲染模式. 当我切换回来时,我会期待相反的情况,这主要发生,除了我的“高标题栏区域”现在是纯黑色。
我发现我可以通过获取窗口的位置、隐藏窗口然后在我的 WM_DWMCOMPOSITIONCHANGED 处理中再次设置窗口的位置来解决这个问题,但这会导致其他可怕的错误(其中至少是窗口 z-order munging)。
我的问题是 - 我在这里做错了什么?似乎窗口以某种方式被置于虚假状态,并且隐藏/显示它可以纠正它。我怎样才能防止这种情况发生?任何指导将不胜感激。
注意:我已经缩小了一些范围。当 DWM 玻璃生效时,在客户区域上渲染的任何被涂成黑色的客户区域部分都将被渲染为透明。我们注意到,当从非 Glass 返回到 Glass 时,客户区域呈现为纯黑色而不是透明。但是,当窗口最大化然后恢复时,窗口将恢复为透明状态。当我随后将窗口缩小时,顶部窗口保持透明。当我将它拖得更大时,窗口的顶部再次变黑。就好像 DWM 正在缓存窗口后面的像素,并且将窗口调整得更大会导致它无法在那里绘制任何东西,因为它的缓存不够大。我似乎找不到任何 DWM 功能来重置此状态。
windows-7 - 桌面窗口管理器捕获整个屏幕
我想知道是否有人可以给我一个如何在 Windows Vista/7 中捕获整个屏幕的起点?我知道如何在以前版本的 Windows 中执行此操作,但我真的很想将所有内容都保留在 D3D 堆栈中,而不求助于 GDI/BltBit 调用。
我意识到如果你有使用 DWM API 的 HWND,你可以获得给定窗口的实时缩略图,但是你如何获得整个桌面的“缩略图”?
谢谢,
亚历克斯
c# - 使用 C#、WPF 和 DWM 保存窗口的屏幕截图
这是此问题的后续问题
上述解决方案使用 DWM 显示活动窗口的缩略图。如果我理解正确,它的工作原理是让您指定要查看的应用程序的窗口句柄,然后让您提供窗口句柄和该窗口上的位置,窗口应在该位置绘制目标窗口的内容。
有没有办法将窗口屏幕截图直接渲染到 BitmapImage 或 Image 而不是直接在窗口中的某个位置绘制它?(基本上只是抓取窗口的屏幕截图——即使它被另一个窗口覆盖——而不使用更新缩略图。)
谢谢你的帮助!
windows - Windows Aero:要画什么颜色才能使“玻璃”出现?
为了使玻璃出现,我必须在客户区涂上什么颜色?
我已经使用以下方法将表单的框架扩展到客户区:
我找不到任何来自 Microsoft 的官方文档,说明 DWM 将寻找什么颜色和/或alpha来替换玻璃。DwmExtendFrameInClientArea上的文档甚至没有提到需要自定义颜色。只有传闻和神话甚至需要特殊的颜色。
我能找到的最接近的是 MSDN 上的一个主题:
使用 DWM 自定义窗框
为了使扩展帧可见,每个扩展帧边下的区域必须具有 alpha 值为 0 的像素数据。
更新:还有一篇博文:
面向开发人员的 Windows Vista – 第 3 部分 – 桌面窗口管理器
碰巧 RGB 黑色 (0x00000000) 的位模式与 100% 透明 ARGB 的位模式相同,因此您实际上可以使用“黑色”GDI 画笔进行绘制,并假设您已指示 DWM 模糊绘制区域,结果将是所需的玻璃效果。
如果我从字面上理解他们所说的(alpha 值为零的像素数据),我会构造一个 alpha 为零的颜色,并在扩展区域中绘制它:
但没有出现玻璃效果:
如果我忽略引用的 MSDN 主题,而是使用完全不透明的黑色(而不是完全透明的黑色):
玻璃效果确实出现了:
然后我被引导相信不透明的黑色是 DWM 将寻找用玻璃替换的像素值。
但是,我如何在玻璃区域上涂黑色物品?
我已经测试在玻璃区域上画一个黑色矩形,旁边有一个圆圈。奇怪的是,矩形没有出现,而圆形却出现了;两者都是相同的颜色:
那么世界上到底发生了什么?在扩展框架区域涂上什么颜色才能使玻璃出现?
更新 2
使用Adisak的建议来准确隔离 Aero 的愚蠢之处,在这里我在黑色圆圈内绘制了一个黑色矩形:
FillEllipse 不支持画黑圈吗?
更新 3
Pondidum想知道使用透明黑色调用Graphics.Clear是否会使玻璃可见:
它确实有效,但您仍然无法在玻璃上绘制不透明的黑色物品:
更新 4
查看Microsoft 的 Vista Bridge 库(围绕不会添加到 .NET 的 Vista 功能的托管包装器),他们只能设法让扩展玻璃框架在 WPF 表单上工作,而不是 WinForms。
也可以看看
directx - 使用 DirectX IDXGIOutput::GetDisplaySurfaceData 进行 DWM 屏幕捕获
我正在尝试通过使用 DXGI 和GetDisplaySurfaceData()
使用 Direct3D 10/11 来捕获 DWM 的 DirectX 表面。
但是,当我IDXGIOutput::TakeOwnership()
在调用 to 之前获得适配器输出的所有权时GetDisplaySurfaceData()
,整个屏幕会暂时变黑,然后恢复(就像在显示模式切换期间一样)。
为什么会发生这种情况,我该如何防止这种情况发生?
windows - 为什么 DwmRegisterThumbnail 会失败?
我正在尝试捕获子窗口的屏幕并将其呈现在 Windows 7 的父表面上。
这总是失败。visualHwnd 是子窗口,hWnd 是父窗口。我也在没有父子关系的情况下尝试了它,它只是没有绘制任何东西,这是意料之中的,因为 if 语句失败。
可能是什么原因?
这是我创建父级的方式:
还有孩子:
winapi - 是否可以捕获包含 Windows 7 DWM 缩略图的窗口?
我开始相信你对 Windows API 无能为力。
我有两个窗户。其中有一个 DWM 缩略图。我想要做的是,我希望能够将带有缩略图的窗口屏幕捕获到另一个窗口中。当我这样做时,使用 bitblt,除了缩略图之外的所有内容都被复制。它只是不在位图中。
那么 DWM 渲染是如何工作的呢?我的意思是,如果 DWM 将缩略图直接渲染到注册窗口的 DC 上,那么我的方法应该可行。我很困惑。
谢谢一堆。
c# - 没有 Aero Glass 的 DwmExtendFrameIntoClientArea
在启用 Aero Glass 的情况下使用DwmExtendFrameIntoClientArea
API 调用效果很好。但是,我希望它在 Aero Glass 被禁用时也能工作,就像它在 Windows 控制面板中的工作方式一样:
请注意框架是如何延伸到客户区域的,即使 Aero Glass 已禁用?当我DwmExtendFrameIntoClientArea
在我的应用程序中进行 API 调用时,返回的 HRESULT 肯定不成功,我的应用程序最终看起来像这样:
http://img197.imageshack.us/img197/9629/clientapplication.png
通常,启用 Aero Glass 后,边框会向下延伸到导航按钮下方,就像在控制面板中一样。我该怎么做呢?DwmExtendFrameIntoClientArea
显然不起作用。
顺便说一句,如果相关,我的应用程序是 WPF 应用程序。