2014-11-22 88 views
1

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

回答

0
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