带有WS_EX_LAYERED的Qt透明子窗口始终失败

时间:2019-03-18 16:30:50

标签: c++ qt winapi libvlc win32gui

我通过创建子窗口并将窗口的句柄传递给libVLC来呈现视频,从而将libVLC集成到Windows的Qt Quick应用程序中。

这很好。

但是,我正在尝试使用WS_EX_LAYERED样式创建子窗口,以便对其应用一些透明度。我根本无法正常工作。

代码如下:

    const auto parentWindow = quickWindow()->winId(); //The native window handle

    const auto windowClassName = QString("VLCWindow-").append(QString::number(reinterpret_cast<int64_t>(this), 16)).toStdWString();
    WNDCLASSEXW wcx = {};
    wcx.cbSize = sizeof(wcx);
    wcx.style = CS_HREDRAW | CS_VREDRAW;
    wcx.lpfnWndProc = DefWindowProcW;
    wcx.hbrBackground = static_cast<HBRUSH>(::GetStockObject(BLACK_BRUSH));
    wcx.hInstance = ::GetModuleHandle(nullptr);
    wcx.lpszClassName = windowClassName.data();
    if (!::RegisterClassExW(&wcx)) {
        const auto lastError = ::GetLastError();
        if (lastError != ERROR_CLASS_ALREADY_EXISTS) {
            qCritical() << "RegisterClassEx failed:" << lastError;
            return;
        }
    }
    const auto nativeWindowHandle = ::CreateWindowExW(WS_EX_LAYERED, wcx.lpszClassName, L"", WS_CHILD | WS_CLIPSIBLINGS, 0, 0, 0, 0, reinterpret_cast<HWND>(parentWindow), nullptr, ::GetModuleHandle(nullptr), nullptr);
    if (nativeWindowHandle) {
        qInfo() << "Created native window for VLC rendering; handle:" << nativeWindowHandle;
    } else {
        auto err = ::GetLastError();
        qCritical() << "CreateWindowEx failed:" << err;
        return;
    }

以上CreateWindowExW总是失败,而GetLastEror()返回0!  删除WS_EX_LAYERED之后,一切都很好,但是我需要WS_EX_LAYERED。 我正在Windows 10上运行代码,因此Windows 8之前的版本WS_EX_LAYERED的限制不适用。

我尝试了以下操作:

  • 调用CreateWindowsExW(0, ...(成功),然后调用SetWindowLongPtrW以应用WS_EX_LAYERED,但是SetWindowLongPtrW返回0,而GetLastError也返回0!

  • 将我自己的lpfnWndProc传递到RegisterClassEx,在那里我记录了收到的所有消息类型;我收到的唯一消息是WM_NCDESTROY,之前没有发送任何WM_NCCREATE

非常感谢!

0 个答案:

没有答案