我在托管 c++ 中实现了一个简单的类(编译成 dll),它在内部使用 IAccessible,如下所示。
public ref class MsaaElement {
public:
System::Drawing::Rectangle MsaaElement::Location() {
long left = 0, top = 0, width = 0, height = 0;
VARIANT v;
v.vt = VT_I4;
v.intVal = childId;
// if not S_OK, return 0, 0, 0, 0
iAccessible->accLocation(&left, &top, &width, &height, v);
return System::Drawing::Rectangle(left, top, width, height);
}
MsaaElement^ MsaaElement::CreateAccessible(IAccessible* accessible) {
return gcnew MsaaElement(accessible, CHILDID_SELF);
}
MsaaElement^ MsaaElement::CreateSimple(IAccessible* accessible, int childId) {
return gcnew MsaaElement(accessible, childId);
}
private:
MsaaElement(IAccessible* accessible, int id)
: iAccessible(accessible), childId(id) {}
IAccessible* iAccessible;
int childId;
};
我在 C# 中创建了一个 MsaaElement,并尝试获取元素的位置。一切正常。我可以多次获得该位置而没有任何问题。
但是,当我将 C# 中的 MsaaElement 传递给另一个线程并尝试在另一个线程中获取元素的位置时,返回的位置始终是 (0,0,0,0)。
为什么 iAccessible 接口在另一个线程中失败?
谢谢。