问题标签 [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 投票
2 回答
353 浏览

c# - 扩展 Win 7 (Aero) 如何绘制它的默认 Windows 和控件

我希望扩展/覆盖 Windows 7 如何绘制其标准 Windows 和控件。现在,我正在对如何修改标准 UI 进行初步研究,以使其对我正在处理的项目更友好一点。

具体来说,我想做的是修改 W7 如何在其 Windows 周围绘制边框,以及如何修改窗口控制按钮(关闭、最小化、退出等)。这是一个全局更改,会影响系统上所有窗口的绘制方式。老实说,我正在寻找与 WindowBlinds 所做的非常相似的功能,至少对于项目的这一部分......

至于如何实现目标,我认为最好的做法是创建一个服务来监视每个进程,或者向每个进程注入一个 DLL,以监视其消息队列中与绘制窗口有关的任何消息。然后它将覆盖该事件,以我希望的方式绘制窗口(或控件)。

不幸的是,我对如何实际做到这一点有点粗略......有人对如何最好地解决这个问题有任何建议吗?任何语言的任何示例(我可能会使用 C# 或 C++)将不胜感激!

0 投票
1 回答
532 浏览

c# - 如何订阅 DWM 组合/Aero Glass 禁用时引发的操作系统级事件?

我正在开发一个在主窗体中支持 Windows Aero 的 C# 应用程序。

一些不支持视觉样式的应用程序,例如GoToMeeting禁用视觉样式,并且我的表单在 GoToMeeting 运行时被错误地绘制(Aero 客户区域被绘制为黑色)。

如何订阅禁用视觉样式时触发的操作系统事件?然后我可以调整窗口中的客户区以正确绘制。

托管和非托管解决方案对我有效。

提前致谢。


编辑:根据汉斯的回答,这里是管理这个事件的代码:

0 投票
1 回答
2425 浏览

wpf - 在 WPF 应用程序中禁用 Aero Peek

我想在我的 WPF 应用程序中禁用 Aero Peek(当用户将鼠标放在“显示桌面”按钮上时,我的应用程序必须可见)。我使用这个 PInvoke 签名:

和这种用法:

在我的 64 位系统(Windows 7 Professional)中,只有在我运行 64 位应用程序时它才有效。如果我在 WOW64 模式下运行 32 位应用程序,我会收到异常:

“对 PInvoke 函数 'XXX::DwmSetWindowAttribute' 的调用使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。 "

你怎么看待这件事?解决办法是什么?

0 投票
3 回答
5306 浏览

c# - 检测 WPF 中的系统主题更改

对于我的 WPF 应用程序,我需要检测 DWM 何时打开/关闭或系统主题何时更改。
WinForms中有这样的事件,但我在WPF中看不到任何事件。

0 投票
2 回答
4443 浏览

wpf - 如果窗口包含 HwndHost 元素,自定义 dwm 绘制的窗口框架会在调整大小时闪烁

我已经考虑了几天,但我认为我对 windows 和 wpf 如何在内部工作以解决这个问题缺乏一些基本的了解。

问题是这样的:

我创建了一个窗口,可以让我在 aero 标题栏(如办公室)上绘制 wpf 控件。只要我不向窗口添加 Hwndhost 元素,这种方法就可以正常工作,在这种情况下,每当我调整它的大小时,框架和 HwndHost 就会开始严重闪烁(其他元素似乎可以正确渲染)。我还尝试使用WPF Shell 集成库中的自定义框架窗口实现,结果是一样的,所以我认为这不完全是我的错。

以下代码是重现问题的简单可编译程序。示例在 c# 中,但答案不一定是。

0 投票
1 回答
886 浏览

c++ - 窗口区域、移动的孩子、DWM 和它可以创建的白色块状混乱

设置:我有一个定义了区域的顶级窗口(使用 创建SetWindowRgn()),并且我有一个移动的子元素(使用SetWindowPos()),这样它的一些像素就会与父窗口区域的剪辑部分重叠。

结果:这些像素被完全不透明的全白色像素填充,而不是保持完全透明(因为它在其父区域之外)。这并不是说子窗口不应该被绘制,因为无论子窗口看起来如何,有问题的像素都是白色的。

下面,橙色的小子窗口沿着父窗口的边缘移动了一点。这只发生在具有透明窗口区域的边缘(因此白色像素始终被限制在父窗口的最大矩形内)。

在此处输入图像描述

如果父窗口被隐藏然后显示,事情会自行纠正(只是无效并强制重绘不会清除白色像素)。

这已在 Vista 和 7 上观察到。如果我禁用桌面窗口管理器 (DWM),此行为就会消失。在一种情况下,它在更新图形驱动程序后也消失了。也许它与这个问题有关?:SetWindowRgn 的 Vista 实时缩略图问题。我原本打算把它作为一个罕见的错误归档,但它的出现足以保证更多的审查。

以前有没有其他人反对过这个?关于 DWM 和窗口区域如何交互的任何见解?

另外,我知道我可以禁用每个应用程序的 DWM,但是这会在应用程序运行时禁用它,除了导致屏幕在启动和关闭时闪烁,这真的不是一个更好的问题。

0 投票
0 回答
1002 浏览

winapi - MDI 应用程序未从 Windows 7 任务栏接收 WM_ACTIVATE 和 DWM 消息

我有一个用 Borland C++Builder 6 编写的 MDI 应用程序(升级到新版本不是一种选择),并且正在使用该ITaskbarList3界面将 MDI 子窗口集成到 Windows 7 任务栏中。按照 Microsoft 的文档,每个 MDI 窗口都会创建一个代理窗口来接收来自任务栏的消息。我注册的选项卡ITaskbarList3确实出现在任务栏上,代理窗口确实接收WM_GETICONWM_ACTIVATEAPPWM_SYSCOMMANDWM_CLOSE消息。但是,它们不接收任何WM_ACTIVATEWM_DWMSENDICONICTHUMBNAILWM_DWMSENDICONICLIVEPREVIEWBITMAP消息。没有这些,该功能将毫无用处。

我认为这可能是一个清单问题(该应用程序确实使用 SoftGems TThemeManager),所以我从 C++Builder 2010 应用程序中提取了一个清单,添加了一个“兼容性”部分以将 Vista 和 Win7 标记为支持的操作系统,并替换了库存带有新清单的已编译可执行文件中的清单。仍然没有运气。

我错过了什么吗?

0 投票
2 回答
2277 浏览

c# - 使用自定义镶边和 DWM 时重新绘制窗口标题

我正在使用 WPF Shell 集成库 ( http://archive.msdn.microsoft.com/WPFShell ) 但是当我使用带有 Aero 的自定义 chrome 时,标题栏被删除。

我知道我需要使用 DrawThemeTextEx 函数来重新绘制窗口标题,但是我找不到任何这样做的 C# 示例。我在使用 DWM (Windows) 的自定义窗口框架中找到了一个指南,详细说明了标题标题的绘制。

我不太确定(我对 pinvoke 的经验很少)如何在 C# 中执行此操作,以便使用正确的系统字体等。有人能够提供我可以集成到 WPF Shell 集成库中的 C# 示例吗?

更新 #1:我已经在 Windows 窗体项目中尝试过这段代码,它工作正常。我注意到如果我将窗体移出屏幕,Windows 窗体将丢失标题文本。所以我相信这个问题可能与此有关。我尝试在 OnRender 事件中绘制标题文本,但这并不能解决问题。

我已将以下代码添加到 WindowChromeWorker.cs:

然后在扩展 DWM 玻璃后,我在以下函数中调用 DrawCustomTitle。知道为什么这不起作用。

0 投票
1 回答
1382 浏览

delphi - 在 pre-vista 上使用 DwmIsCompositionEnabled (JwaDwmApi) 会导致错误

一直在尝试使用以下代码来检查是否启用了 Windows Aero:

但是,在 pre-vista 机器上这样做会导致应用程序崩溃,因为 DWMApi.dll 丢失。我也尝试过这段代码,但是它连续产生 2 个 AV。我怎样才能做到这一点 ?我正在使用 Delphi 2010。:)

0 投票
0 回答
649 浏览

vb.net - DwmExtendFrameIntoClientArea Not working the same on Vista

Ive been using the class Glass_full from here: http://www.dreamincode.net/forums/topic/146813-glass-form-dwmapidll-api/

It works fine on Windows 7. Ive even managed to find a easy workaround for the text issue. I solved this by using a custom color for backcolor and transparencyKey on the form (Color is rgb 1,2,3) This works fine on 7 but when the same code is ran on Vista it doesnt render the glass.

I can render the glass with backcolor black, and transparencyKey works to make the form completely transparent, but when combined like i did on 7, the glass doesnt render. (I get rgb 1,2,3 for a background)

I tried adding a propertyGrid to a form and using it to set the backcolor and transparencyKeys for testing but DWM would crash when i set transparencykey to the same as backcolor.

Is there any way of fixing this?