制作Qt顶级窗口"拥有"通过单个进程中的其他非Qt窗口

时间:2017-05-04 17:48:46

标签: c++ qt winapi hwnd

通过Qt API在Windows上可行吗?我需要这样的功能/行为因为我想将我的Qt代码作为插件集成到第三方应用程序中,我想尽可能无缝地完成它。例如,我不想在任务栏上有另一个代表我的Qt窗口的项目。我正在谈论单流程应用

我找到了一种使用WinAPI和HWND的方法:

// The Qt frame is "alien". We need its HWND so transform it (and all its ancestors,
// which is probably fine for me) to a "native" widget first. 
Q_ASSERT(!frame->testAttribute(Qt::WA_NativeWindow));
frame->setAttribute(Qt::WA_NativeWindow);
Q_ASSERT(frame->testAttribute(Qt::WA_NativeWindow));

// Get the HWND.
QWindow* frameHandle = frame->windowHandle();
Q_ASSERT(frameHandle);
HWND frameHwnd = HWND(frameHandle->winId());
Q_ASSERT(frameHwnd);

// And use it to set the frame's "owner" (not "parent" because WS_CHILD bit is not set).
Q_ASSERT((GetWindowLongPtr(frameHwnd, GWL_STYLE) & WS_CHILD) == 0);
SetWindowLongPtr(frameHwnd, GWLP_HWNDPARENT, LONG_PTR(getOtherNonQtWindowHwnd()));

如果在显示框架后完成,这似乎按预期工作。但是这种解决方案有点奇怪,我担心这甚至是危险的。此外,Qt本身可能会在以后随时覆盖设置。

从上面的代码片段中可以看出,我能够检索第三方应用程序主窗口的HWND。因此,从WinAPI的角度来看,它应该是可行的。拜托,有没有一些Qt方式这样做?或者至少是一个更好的解决方案?

0 个答案:

没有答案