Chcę zaimplementować edytor tekstu od zera, który obsługuje interfejs IAccessible. Używam MFC i Win32 API.Jakie jest prawidłowe rozwiązanie do obsługi interfejsu IAccesible dla ruchu przewijania w edytorach tekstu?
Gdy zmienia się pozycja karetki w standardowych edytorach tekstów, takich jak Notatnik, odpowiednia litera, słowo lub linia do ruchu karetki jest wymawiana przez narzędzia klienta, takie jak Narrator, JAWS itp. Nie wiem, jak zaimplementować tę funkcję . Przeszukuję internet i czytam dokumentację MSDN.
Przeczytałem w http://msdn.microsoft.com/en-us/library/dd317978.aspx i http://msdn.microsoft.com/en-us/library/dd373892.aspx, że klient prosi o caret metodą AccessibleObjectFromWindow z OS, a OS wysyła WM_GETOBJECT do aplikacji. Wiadomości WM_GETOBJECT odebrane w odpowiedniej funkcji wywołania zwrotnego okna, ale hWnd dla zdarzenia ruchu przewijania ma wartość NULL. Sprawdziłem kolejkę komunikatów wątku, ale pozycja WM_GETOBJECT w ogóle nie została odebrana w kolejce komunikatów wątków.
Jedną z metod, która pracowała nieco, ale nie poprawnym rozwiązaniem jest wywołanie
NotifyWinEvent(EVENT_OBJECT_NAMECHANGE, hwnd, OBJID_CLIENT, CHILDID_SELF)
gdy ruch daszka przez użytkownika. A kiedy klient poprosi o zmienioną nazwę, zwrócę odpowiedni tekst związany z ruchem karetki.
HRESULT CMyEditor::get_accName(VARIANT varChild, BSTR *pszName)
{
*pszName = SysAllocString(L"CORESPONDING TEXT TO THE CARET MOVEMENT");
return S_OK;
}