[英]QT Translucent window and remote desktop
我正在为某些部分使用QML创建一个Qt / C ++应用程序。 在windows下我想使用ExtendFrameIntoClientArea的半透明窗口,如我的窗口类的这个片段所示。
#ifdef Q_WS_WIN
if ( QSysInfo::windowsVersion() == QSysInfo::WV_VISTA ||
QSysInfo::windowsVersion() == QSysInfo::WV_WINDOWS7 )
{
EnableBlurBehindWidget(this, true);
ExtendFrameIntoClientArea(this);
}
#else
代码运行良好,但有一个例外。 如果关闭透明窗口系统,背景将变为黑色,并且由于我的UI的一部分是透明的,它也会变暗。 登录到运行应用程序的远程计算机时会发生同样的事情,即使透明窗口系统立即重新初始化,背景保持黑色,直到再次执行上述代码。 在此图像中演示了这一点: 渲染失败(在背景中)和正确(在前面)的比较。
问题是找到一个连接重新初始化透明窗口的信号,或者更好地检测何时透明地绘制窗口并相应地绘制UI。 任何替代解决方案也欢迎。
在Qt和MSDN Aero文档中进行了深入研究后,我提出了两步解决方案。 通过覆盖主窗口的winEvent
方法,我能够接收每次启用或禁用半透明窗口系统时触发的信号。
#define WM_DWMCOMPOSITIONCHANGED 0x031E
bool MainWindow::winEvent(MSG *message, long *result) {
if ( message->message == WM_DWMCOMPOSITIONCHANGED ) {
// window manager signaled change in composition
return true;
}
return false;
}
这让我非常接近,但它并没有告诉我DWM目前是否正在绘制透明窗口。 通过使用dwmapi.dll
我能够找到一个完全正确的方法,它可以像下面这样访问:
// QtDwmApi.cpp
extern "C"
{
typedef HRESULT (WINAPI *t_DwmIsCompositionEnabled)(BOOL *pfEnabled);
}
bool DwmIsCompositionEnabled() {
HMODULE shell;
shell = LoadLibrary(L"dwmapi.dll");
if (shell) {
BOOL enabled;
t_DwmIsCompositionEnabled is_composition_enabled = \
reinterpret_cast<t_DwmIsCompositionEnabled>(
GetProcAddress (shell, "DwmIsCompositionEnabled")
);
is_composition_enabled(&enabled);
FreeLibrary (shell);
if ( enabled ) {
return true;
} else {
return false;
}
}
return false;
}
我的实现现在能够对Aero中的更改做出反应并相应地绘制GUI。 通过远程桌面登录时,窗口也是使用透明度绘制的。
The function should be written as follows to avoid the GPA failure
// QtDwmApi.cpp
extern "C"
{
typedef HRESULT (WINAPI *t_DwmIsCompositionEnabled)(BOOL *pfEnabled);
}
bool DwmIsCompositionEnabled() {
HMODULE shell;
BOOL enabled=false;
shell = LoadLibrary(L"dwmapi.dll");
if (shell) {
t_DwmIsCompositionEnabled is_composition_enabled = \
reinterpret_cast<t_DwmIsCompositionEnabled>(
GetProcAddress (shell, "DwmIsCompositionEnabled")
);
if (is_composition_enabled)
is_composition_enabled(&enabled);
FreeLibrary (shell);
}
return enabled;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.