我在VS2012上使用Qt。我的部分代码包含拦截正在工作的其他窗口(其他应用程序)。我设法拦截,但当我想释放那个窗口时,我不能。 此外,当我关闭我的应用程序时,另一个窗口应该释放并继续作为一个独立的应用程序工作(就像它在截取之前)。现在该应用程序仍在工作(在窗口任务管理器中,该过程仍然有效)但没有可见的窗口。
我的部分代码允许拦截其他窗口:
void MyApp::setWindow(const QString& name)
{
WId windowId = (WId) ::FindWindow(0, (TCHAR*)name.utf16());
if(windowId != NULL)
{
childWindow = QWindow::fromWinId(windowId); //QWindow* childWindow
childWidget = QWidget::createWindowContainer(childWindow); //QWidget* childWidget
childWidget->setParent(mainWidget); //QWidget* mainwidget = ui.mainWidget;
childWidget->show();
}
}
我尝试通过将parent设置为0来释放它:
childWidget->setParent(0);
但它不起作用。
知道怎么做吗?
答案 0 :(得分:0)
childWidget->setParent(0);
无论如何都不会将该窗口置于正确的上下文中。但是,您可以使用本地进程事件来脱离该外部窗口。然后,您应该关闭childWidget(最有可能)或将其传输到其他地方(不太可能)。
childWidget.close();
只要我们不知道其他app逻辑,我们就会遇到运行时错误。通常我们不会劫持任何任意窗口,我们在一些受控环境中这样做,例如我们为给定的网页创建Chromium渲染器,并且Web浏览器页面窗口在自己的进程中运行,其窗口设计为放在其他一些上下文中。
对国际广角的处理不正确:
只要您尝试使用FindWindow,它可以解析为FindWindowA接受ANSI字符串或FindWindowW(我认为是这种情况)接受宽字符串而不是UTF,这意味着不同的格式而不是此API 。匹配类型的角色并不总是足够的。宽字符 here 用于当前语言环境,因此使用UTF-16欺骗它们可能导致代码无法找到如下窗口。 UTF中的任何一个都是通过因特网等在不同环境之间传输国际文本,以及能够处理它们的API。
WId windowId = (WId) ::FindWindow(0, (TCHAR*)name.utf16()); // Don't convert to utf16 here. To WCHAR. toStdWString().c_str() or so