2013-03-28 10 views
13

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; 
} 

Odpowiedz

5

klient użyłby SetWinEventHook() funkcję śledzenia następujące zdarzenia karetki:

  • EVENT_OBJECT_CREATE
  • EVENT_OBJECT_DESTROY
  • EVENT_OBJECT_SHOW
  • EVENT_OBJECT_HIDE
  • EVENT_OBJECT_LOCATIONCHANGE
  • EVENT_OBJECT_FOCUS

Jeśli używasz niestandardowego formantu, trzeba użyć NotifyWinEvent() ognia tych wydarzeń siebie, zwłaszcza EVENT_OBJECT_LOCATIONCHANGE które powinny powodować narrację.

Gdy klient obsługiwać thoses zdarzeń, należy otworzyć interfejs IAccessible obiektu on śledzenie za pomocą AccessibleObjectFromEvent().

Jak można powiedzieć, Microsoft Active Accessibility będzie obsługiwać tej rozmowy i wysyłanie wiadomości WM_GETOBJECT do odpowiedniego okna w zależności od obsługi dany AccessibleObjectFromEvent() (które powinny być zawarte w moduł obsługi zdarzenia).

Po odebraniu WM_GETOBJECT dla karetki należy zwrócić odpowiednią IAccessible interfejs, który będzie zgłosić prawidłowego accRole i accLocation.

Jeśli nie otrzymujesz właściwej wiadomości WM_GETOBJECT, może to oznaczać, że nie uruchamiasz właściwych zdarzeń.

Można użyć Przystępny zdarzenia Watcher aby sprawdzić, czy odpowiednie zdarzenia wysyłane są: http://msdn.microsoft.com/en-us/library/windows/desktop/dd317979%28v=vs.85%29.aspx

Patrz Przewodnik programisty dla aktywnych serwerów Accessibility na MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/dd318053%28v=vs.85%29.aspx

Edycja

Ponadto, jeśli używasz standardowego karetki dostarczonej przez Riched20.dll (w wersji Rich Edit as), dokumentacja n zastrzega, że ​​w przeciwieństwie do innych elementów interfejsu użytkownika, nie ma powiązanego uchwytu okna.