从其他窗口(Qt)释放窗口?

问题描述:

我在VS2012上使用Qt。我的部分代码包含拦截正在工作的其他窗口(其他应用程序)。我用拦截进行管理,但是当我想释放窗口时,我不能。 另外,当我关闭我的应用程序时,其他窗口应该释放并继续作为独立应用程序工作(就像截取前一样)。现在,该应用程序仍在工作(在窗口任务管理器中,该过程仍在工作),但没有可见的窗口。我的代码从其他窗口(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(); 
    } 
} 

我已经设置父母试图释放它为0:

childWidget->setParent(0); 

,但没有奏效。

任何想法如何做到这一点?

+0

您是否曾经找到过解决方案? – TheSHEEEP 2017-02-20 13:40:53

childWidget->setParent(0); 

无论如何不会放置该窗口来纠正上下文。尽管如此,您可以通过本地流程事件来解除外部窗口。然后,您应该关闭childWidget(最有可能)或将其运送到其他地方(不太可能)。

childWidget.close(); 

这里我们可能会遇到运行时错误,只要我们不知道其他应用逻辑。通常我们不会劫持任何任意的窗口,我们在一些受控的环境中执行它。我们为给定的网页创建Chromium渲染器,并且Web浏览器页面窗口正在自己的进程中运行,并且其窗口被设计为放入其他上下文中。

不正确的处理国际宽字符:

只要你尝试FindWindow函数可以解决要么FindWindowA接受ANSI字符的字符串或FindWindowW(我认为是这样)接受宽字符串而不是UTF这意味着不同的格式,而不是这个API。匹配类型的角色并不总是足够的。宽字符这里的用于当前语言环境,所以用UTF-16欺骗它们可能会导致代码找不到如下所示的窗口。 UTF中的任何一种都可以通过Internet或其他方式在不同的上下文之间传输国际文本,以及可以处理它们的API。

WId windowId = (WId) ::FindWindow(0, (TCHAR*)name.utf16()); // Don't convert to utf16 here. To WCHAR. toStdWString().c_str() or so