我正在尝试使用Thunderbird API:http://www.linuxfoundation.org/collaborate/workgroups/accessibility/iaccessible2访问(仅适用于Windows) IAccessible2 /Thunderbird中的信息,但是我几乎在第一步就失败了。我可以先获取这两个应用程序的IAccessible接口,然后再获取IServiceProvider接口。但是,当我调用QueryService来获取IAccessible2接口时,如下所述:http://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/_generalinfo.html#_dicoveringInterfaces总是返回E_INVALIDARG。
AccProbe成功返回两个应用程序的IA2信息。QueryService的MS文档没有将E_INVALIDARG列为可能的返回值。但是浏览mozilla源代码时,如果第一个参数(服务ID)是意外的,则会返回此消息,否则会调用QueryInterface (如果接口ID不正确,则会返回E_NOINTERFACE )。所以..。这意味着QueryService的第一个参数是错误的;但我几乎尝试了mozilla期望的每个值,没有区别。
我从c#开始,然后在c++中再次尝试,以防我在InterOp中丢失了一些东西。在两种语言中的结果相同。下面是我当前的c++测试代码:
HWND hw = GetForegroundWindow();
IAccessible *pIA;
HRESULT hr = AccessibleObjectFromWindow(hw, OBJID_WINDOW, IID_IAccessible, (void**)&pIA);
if (!SUCCEEDED(hr))
return -1;
// SNIP - calls pIA->get_accName to check correct window is being accessed. This works OK.
const IID IID_IAccessible2 = {0xE89F726E, 0xC4F4, 0x4c19, 0xbb, 0x19, 0xb6, 0x47, 0xd7, 0xfa, 0x84, 0x78};
::IServiceProvider *pService = NULL;
hr = pIA->QueryInterface(IID_IServiceProvider, (void **)&pService);
if(SUCCEEDED(hr))
{
IAccessible2 *pIA2 = NULL;
hr = pService->QueryService(IID_IAccessible2, IID_IAccessible2, (void**)&pIA2);
if (SUCCEEDED(hr) && pIA2)
{
// Always fails with E_INVALIDARG
pIA2->Release();
}
pService->Release();
} 这都是在Win7上实现的--使用32位和64位。Firefox 3.6.24和Thunderbird 8.0。Visual Studio 2005
我做错了什么吗?
发布于 2011-12-13 19:06:44
HRESULT hr = AccessibleObjectFromWindow(hw, OBJID_WINDOW, IID_IAccessible, (void**)&pIA);
if (!SUCCEEDED(hr))
return -1;我认为问题出在这里--用OBJID_CLIENT替换OBJID_WINDOW,它似乎还行得通。(我没有注册类型库,但我可以对IID_IAccessible和IUnknown接口进行QS,它似乎可以工作。另外,还要确保使用CoInitialize()。)
IAccessible有一个有趣的层次结构:每个HWND都有一个“窗口”部分和一个“客户端”部分。这在一定程度上是由于Win32的内部工作方式;Win32硬件驱动程序可以有标题栏、菜单、滚动条等项,它们都共享相同的硬件驱动程序-以及实际控件内容所在的内容区域(也称为客户端区)。为了让这些项目有自己的表示,MSAA的设计者选择了一个两级结构,其中OBJID_WINDOW表示整个窗口,它有子级,然后表示滚动条、菜单栏、标题栏等内容-如果它们存在的话。
然而,实现可访问性的窗口部分通常是客户端部分,因此您通常需要请求OBJID_CLIENT来获得“真正的”IAccessible。
https://stackoverflow.com/questions/8464101
复制相似问题