首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QT半透明窗口和远程桌面

QT半透明窗口和远程桌面
EN

Stack Overflow用户
提问于 2012-07-11 16:32:56
回答 2查看 1.6K关注 0票数 5

我正在使用QML为某些部分创建一个Qt/C++应用程序。在windows下,我想使用ExtendFrameIntoClientArea的半透明窗口,如我的window类中的代码片段所示。

代码语言:javascript
复制
#ifdef Q_WS_WIN
    if ( QSysInfo::windowsVersion() == QSysInfo::WV_VISTA ||
         QSysInfo::windowsVersion() == QSysInfo::WV_WINDOWS7 )
    {
        EnableBlurBehindWidget(this, true);
        ExtendFrameIntoClientArea(this);
    }
#else

代码运行良好,但有一个例外。如果关闭透明窗口系统,背景就会变黑,而我的UI的一部分是透明的,背景也会变暗。当登录到运行应用程序的远程计算机时,也会发生同样的事情,即使透明窗口系统立即重新初始化,在再次执行上述代码之前,背景仍然是黑色的。下面的图像演示了这一点:Comparison of failed rendering (in background) and correct (in front).

问题是找到一个信号来连接到重新初始化透明窗口,或者更好的是检测窗口何时被透明地绘制并相应地绘制UI。任何替代解决方案也是受欢迎的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-23 21:35:04

在深入研究了Qt和MSDN Aero documentation之后,我想出了一个两步解决方案。通过重写我的主窗口的winEvent方法,我能够接收在每次启用或禁用半透明窗口系统时触发的信号。

代码语言:javascript
复制
#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,我能够找到一个完全可以做到这一点的方法,并且可以像下面这样访问它:

代码语言:javascript
复制
// 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。当通过远程桌面登录时,窗口也会在可用的情况下使用透明度绘制。

票数 2
EN

Stack Overflow用户

发布于 2014-02-24 15:15:49

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11428597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档