我通过创建子窗口并将窗口的句柄传递给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
!
非常感谢!