5#include <QtGui/qtguiglobal.h>
6#if QT_CONFIG(accessibility)
8#include "qwindowsuiaaccessibility.h"
9#include "qwindowsuiautomation.h"
10#include "qwindowsuiamainprovider.h"
11#include "qwindowsuiautils.h"
13#include <QtGui/qaccessible.h>
14#include <QtGui/qwindow.h>
15#include <QtGui/qguiapplication.h>
16#include <QtGui/private/qguiapplication_p.h>
17#include <QtCore/qt_windows.h>
18#include <qpa/qplatformintegration.h>
20#include <QtCore/private/qwinregistry_p.h>
24using namespace QWindowsUiAutomation;
25using namespace Qt::StringLiterals;
27bool QWindowsUiaAccessibility::m_accessibleActive =
false;
29QWindowsUiaAccessibility::QWindowsUiaAccessibility()
33QWindowsUiaAccessibility::~QWindowsUiaAccessibility()
38bool QWindowsUiaAccessibility::handleWmGetObject(HWND hwnd, WPARAM wParam, LPARAM lParam, LRESULT *lResult)
41 QGuiApplicationPrivate::platformIntegration()->accessibility()->setActive(
true);
42 m_accessibleActive =
true;
45 if (QCoreApplication::startingUp() || QCoreApplication::closingDown())
48 if (QWindow *window = QWindowsContext::instance()->findWindow(hwnd)) {
49 if (QAccessibleInterface *accessible = window->accessibleRoot()) {
50 auto provider = QWindowsUiaMainProvider::providerForAccessible(accessible);
51 *lResult = UiaReturnRawElementProvider(hwnd, wParam, lParam, provider.Get());
60static QString alertSound(
const QObject *object)
62 if (object->inherits(
"QMessageBox")) {
68 switch (object->property(
"icon").toInt()) {
70 return QStringLiteral(
"SystemAsterisk");
72 return QStringLiteral(
"SystemExclamation");
74 return QStringLiteral(
"SystemHand");
78 return QStringLiteral(
"SystemAsterisk");
81static QString soundFileName(
const QString &soundName)
83 const QString key =
"AppEvents\\Schemes\\Apps\\.Default\\"_L1
84 + soundName +
"\\.Current"_L1;
85 return QWinRegistryKey(HKEY_CURRENT_USER, key).stringValue(L"");
88static void playSystemSound(
const QString &soundName)
90 if (!soundName.isEmpty() && !soundFileName(soundName).isEmpty()) {
91 PlaySound(
reinterpret_cast<
const wchar_t *>(soundName.utf16()),
nullptr,
92 SND_ALIAS | SND_ASYNC | SND_NODEFAULT | SND_NOWAIT);
97void QWindowsUiaAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event)
103 switch (event->type()) {
104 case QAccessible::PopupMenuStart:
105 playSystemSound(QStringLiteral(
"MenuPopup"));
107 case QAccessible::MenuCommand:
108 playSystemSound(QStringLiteral(
"MenuCommand"));
110 case QAccessible::Alert:
111 playSystemSound(alertSound(event->object()));
119 if (!m_accessibleActive)
122 QAccessibleInterface *accessible = event->accessibleInterface();
123 if (!isActive() || !accessible || !accessible->isValid())
127 if (!UiaClientsAreListening())
130 switch (event->type()) {
131 case QAccessible::Announcement:
132 QWindowsUiaMainProvider::raiseNotification(
static_cast<QAccessibleAnnouncementEvent *>(event));
134 case QAccessible::Focus:
135 QWindowsUiaMainProvider::notifyFocusChange(event);
137 case QAccessible::StateChanged:
138 QWindowsUiaMainProvider::notifyStateChange(
static_cast<QAccessibleStateChangeEvent *>(event));
140 case QAccessible::ValueChanged:
141 QWindowsUiaMainProvider::notifyValueChange(
static_cast<QAccessibleValueChangeEvent *>(event));
143 case QAccessible::NameChanged:
144 QWindowsUiaMainProvider::notifyNameChange(event);
146 case QAccessible::RoleChanged:
147 QWindowsUiaMainProvider::notifyRoleChange(event);
149 case QAccessible::SelectionAdd:
150 QWindowsUiaMainProvider::notifySelectionChange(event);
152 case QAccessible::TextAttributeChanged:
153 case QAccessible::TextColumnChanged:
154 case QAccessible::TextInserted:
155 case QAccessible::TextRemoved:
156 case QAccessible::TextUpdated:
157 case QAccessible::TextSelectionChanged:
158 case QAccessible::TextCaretMoved:
159 QWindowsUiaMainProvider::notifyTextChange(event);