2014-11-22 5 views
1

Я работаю с Qt на 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(); 
    } 
} 

Я попытался освободить его от заходящего родителя как 0:

childWidget->setParent(0); 

, но это не сработало.

Любая идея, как это сделать?

+0

Вы когда-нибудь находили решение этого вопроса? – TheSHEEEP

ответ

0
childWidget->setParent(0); 

Не будет помещать это окно в соответствие с контекстом. Вы можете сделать это, чтобы отключить это внешнее окно с локальными событиями процесса. Затем вы должны просто закрыть childWidget (наиболее вероятный) или передать его где-то еще (маловероятно).

Здесь мы можем получить ошибку времени выполнения, если мы не знаем другую логику приложения. Обычно мы не захватываем любое произвольное окно, мы делаем это в некоторой контролируемой среде, например. мы создаем Chromium renderer для данной веб-страницы и что окно страницы веб-браузера запускается в собственном процессе, и его окно предназначено для размещения в каком-то другом контексте.

Неправильное обращение международных широких символы:

До тех пор, как вы пытались FindWindow это может решить либо FindWindowA для принятия ANSI символьной строки или FindWindowW (я считаю, что это так) для принятия широких символов а не UTF, который подразумевает другой формат, а не для этого API. Совпадающий тип персонажа не всегда достаточно. Широкие символы здесь относятся к текущему языку, поэтому их подмена 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 
Смежные вопросы