Windows QPA: Fix UIA-to-MSAA accessibility bridge

According to MS sample code, MSAA requests should be replied with
UI Automation providers to enable the use the UIA-to-MSAA bridge, in
order to support MSAA-only clients. Also changing the mapping of
QAccessible::Client from UIA_CustomControlTypeId to UIA_GroupControlTypeId,
as it seems more appropriate and avoids an incorrect mapping to a push button
type in the UIA-to-MSAA conversion.

Change-Id: I5149d250da2d1bd7b14b44ca46e856a81c9be045
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
This commit is contained in:
Andre de la Rocha 2018-08-06 15:27:21 +02:00
parent a09a28879e
commit f271dd8f96
2 changed files with 11 additions and 14 deletions

View File

@ -68,21 +68,18 @@ QWindowsUiaAccessibility::~QWindowsUiaAccessibility()
// Handles UI Automation window messages. // Handles UI Automation window messages.
bool QWindowsUiaAccessibility::handleWmGetObject(HWND hwnd, WPARAM wParam, LPARAM lParam, LRESULT *lResult) bool QWindowsUiaAccessibility::handleWmGetObject(HWND hwnd, WPARAM wParam, LPARAM lParam, LRESULT *lResult)
{ {
if (lParam == LPARAM(UiaRootObjectId)) { // Start handling accessibility internally
QGuiApplicationPrivate::platformIntegration()->accessibility()->setActive(true);
// Start handling accessibility internally // Ignoring all requests while starting up / shutting down
QGuiApplicationPrivate::platformIntegration()->accessibility()->setActive(true); if (QCoreApplication::startingUp() || QCoreApplication::closingDown())
return false;
// Ignoring all requests while starting up / shutting down if (QWindow *window = QWindowsContext::instance()->findWindow(hwnd)) {
if (QCoreApplication::startingUp() || QCoreApplication::closingDown()) if (QAccessibleInterface *accessible = window->accessibleRoot()) {
return false; QWindowsUiaMainProvider *provider = QWindowsUiaMainProvider::providerForAccessible(accessible);
*lResult = QWindowsUiaWrapper::instance()->returnRawElementProvider(hwnd, wParam, lParam, provider);
if (QWindow *window = QWindowsContext::instance()->findWindow(hwnd)) { return true;
if (QAccessibleInterface *accessible = window->accessibleRoot()) {
QWindowsUiaMainProvider *provider = QWindowsUiaMainProvider::providerForAccessible(accessible);
*lResult = QWindowsUiaWrapper::instance()->returnRawElementProvider(hwnd, wParam, lParam, provider);
return true;
}
} }
} }
return false; return false;

View File

@ -149,7 +149,7 @@ long roleToControlTypeId(QAccessible::Role role)
{QAccessible::Caret, UIA_CustomControlTypeId}, {QAccessible::Caret, UIA_CustomControlTypeId},
{QAccessible::AlertMessage, UIA_CustomControlTypeId}, {QAccessible::AlertMessage, UIA_CustomControlTypeId},
{QAccessible::Window, UIA_WindowControlTypeId}, {QAccessible::Window, UIA_WindowControlTypeId},
{QAccessible::Client, UIA_CustomControlTypeId}, {QAccessible::Client, UIA_GroupControlTypeId},
{QAccessible::PopupMenu, UIA_MenuControlTypeId}, {QAccessible::PopupMenu, UIA_MenuControlTypeId},
{QAccessible::MenuItem, UIA_MenuItemControlTypeId}, {QAccessible::MenuItem, UIA_MenuItemControlTypeId},
{QAccessible::ToolTip, UIA_ToolTipControlTypeId}, {QAccessible::ToolTip, UIA_ToolTipControlTypeId},