diff --git a/dlls/oleacc/main.c b/dlls/oleacc/main.c index 9d5320e7648..c7a622beb6c 100644 --- a/dlls/oleacc/main.c +++ b/dlls/oleacc/main.c @@ -24,6 +24,7 @@ #include "windef.h" #include "winbase.h" #include "ole2.h" +#include "commctrl.h" #include "initguid.h" #include "oleacc_private.h" @@ -36,6 +37,54 @@ WINE_DEFAULT_DEBUG_CHANNEL(oleacc); static const WCHAR lresult_atom_prefix[] = {'w','i','n','e','_','o','l','e','a','c','c',':'}; +static const WCHAR menuW[] = {'#','3','2','7','6','8',0}; +static const WCHAR desktopW[] = {'#','3','2','7','6','9',0}; +static const WCHAR dialogW[] = {'#','3','2','7','7','0',0}; +static const WCHAR winswitchW[] = {'#','3','2','7','7','1',0}; +static const WCHAR mdi_clientW[] = {'M','D','I','C','l','i','e','n','t',0}; +static const WCHAR richeditW[] = {'R','I','C','H','E','D','I','T',0}; +static const WCHAR richedit20aW[] = {'R','i','c','h','E','d','i','t','2','0','A',0}; +static const WCHAR richedit20wW[] = {'R','i','c','h','E','d','i','t','2','0','W',0}; + +typedef HRESULT (WINAPI *accessible_create)(HWND, const IID*, void**); + +static struct { + const WCHAR *name; + DWORD idx; + accessible_create create_client; + accessible_create create_window; +} builtin_classes[] = { + {WC_LISTBOXW, 0x10000, NULL, NULL}, + {menuW, 0x10001, NULL, NULL}, + {WC_BUTTONW, 0x10002, NULL, NULL}, + {WC_STATICW, 0x10003, NULL, NULL}, + {WC_EDITW, 0x10004, NULL, NULL}, + {WC_COMBOBOXW, 0x10005, NULL, NULL}, + {dialogW, 0x10006, NULL, NULL}, + {winswitchW, 0x10007, NULL, NULL}, + {mdi_clientW, 0x10008, NULL, NULL}, + {desktopW, 0x10009, NULL, NULL}, + {WC_SCROLLBARW, 0x1000a, NULL, NULL}, + {STATUSCLASSNAMEW, 0x1000b, NULL, NULL}, + {TOOLBARCLASSNAMEW, 0x1000c, NULL, NULL}, + {PROGRESS_CLASSW, 0x1000d, NULL, NULL}, + {ANIMATE_CLASSW, 0x1000e, NULL, NULL}, + {WC_TABCONTROLW, 0x1000f, NULL, NULL}, + {HOTKEY_CLASSW, 0x10010, NULL, NULL}, + {WC_HEADERW, 0x10011, NULL, NULL}, + {TRACKBAR_CLASSW, 0x10012, NULL, NULL}, + {WC_LISTVIEWW, 0x10013, NULL, NULL}, + {UPDOWN_CLASSW, 0x10016, NULL, NULL}, + {TOOLTIPS_CLASSW, 0x10018, NULL, NULL}, + {WC_TREEVIEWW, 0x10019, NULL, NULL}, + {MONTHCAL_CLASSW, 0, NULL, NULL}, + {DATETIMEPICK_CLASSW, 0, NULL, NULL}, + {WC_IPADDRESSW, 0, NULL, NULL}, + {richeditW, 0x1001c, NULL, NULL}, + {richedit20aW, 0, NULL, NULL}, + {richedit20wW, 0, NULL, NULL}, +}; + static HINSTANCE oleacc_handle = 0; const char *debugstr_variant(const VARIANT *v) @@ -81,20 +130,65 @@ int convert_child_id(VARIANT *v) } } +static accessible_create get_builtin_accessible_obj(HWND hwnd, LONG objid) +{ + WCHAR class_name[64]; + int i, idx; + + if(!RealGetWindowClassW(hwnd, class_name, sizeof(class_name)/sizeof(WCHAR))) + return NULL; + TRACE("got window class: %s\n", debugstr_w(class_name)); + + for(i=0; i