QAxWidget 从客户端应用程序窃取焦点
QAxWidget steals focus from client application
调用更改 QAxWidget GUI 的函数会使调用者失去焦点。
我怎样才能避免这种情况?
某些操作使 Windows 将活动 window 状态转移到另一个 window / 应用程序。
当您触发其中之一时,您的 ActiveX 应用程序将变为活动状态,因此您将失去对客户端应用程序的关注。
为避免这种使用,可以编写一个作用域守卫,在 Windows 错误地 转移活动状态后将焦点重置到您的客户端:
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()");
}
调用更改 QAxWidget GUI 的函数会使调用者失去焦点。 我怎样才能避免这种情况?
某些操作使 Windows 将活动 window 状态转移到另一个 window / 应用程序。 当您触发其中之一时,您的 ActiveX 应用程序将变为活动状态,因此您将失去对客户端应用程序的关注。
为避免这种使用,可以编写一个作用域守卫,在 Windows 错误地 转移活动状态后将焦点重置到您的客户端:
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()");
}