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

时间:2014-11-22 11:51:30

标签: c++ windows qt visual-studio-2012

我在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);

但它不起作用。

知道怎么做吗?

1 个答案:

答案 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