Некоторые действия заставляют 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()");
}