QAxWidget крадет фокус из клиентского приложения - PullRequest
0 голосов
/ 29 апреля 2020

При вызове функции, которая изменяет GUI QAxWidget, вызывающий абонент теряет фокус. Как я могу избежать этого?

1 Ответ

0 голосов
/ 29 апреля 2020

Некоторые действия заставляют Windows переносить состояние активного окна в другое окно / приложение. Когда вы запускаете одно из них, ваше приложение ActiveX становится активным, и поэтому вы теряете фокус в своем клиентском приложении.

Чтобы избежать такого использования, можно написать защитную область, которая сбрасывает фокус на вашего клиента после того, как Windows неверно передал активное состояние 1004 *:

class AxFocusScopeGuard
{
public:
    AxFocusScopeGuard(QWidget* parentWidget)
        : m_focusedWidget(parentWidget->focusWidget())
    { }

    ~AxFocusScopeGuard()
    {
        QCoreApplication::processEvents();
        if(m_focusedWidget)
            m_focusedWidget->setFocus();
    }

private:
    QWidget* m_focusedWidget = nullptr;
};


void ActiveXCallHandler::updateGuiActiveX()
{
    AxFocusScopeGuard guard(m_parentWidget);
    axWidget->dynamicCall("updateYourGui()");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...