在C#.net代码中,一直尝试以下列方式使用interface getAccessibleContextAt
。
getAccessibleContextFromHWND
获取应用程序上下文和vmid的指针。这些不为零,getAccessibleContextFromHWND
返回true。getAccessibleContextAt
获取基础控件的上下文。此方法返回true,但控件的指针为零。 以下是我正在使用的代码:
private void GetJavaElementDetails(IntPtr javaAppHandle, int x, int y)
{
if (JABHelper.isJavaWindow(javaAppHandle)==1)
{
Int32 vmid;
IntPtr appContextPointer, ctlContextPointer;
bool result = JABHelper.getAccessibleContextFromHWND(javaAppHandle, out vmid, out appContextPointer);
result = JABHelper.getAccessibleContextAt(vmid, appContextPointer, x, y, out ctlContextPointer);
AccessibleContextInfo acinfo = new AccessibleContextInfo();
IntPtr acinfoPtr = Marshal.AllocHGlobal(Marshal.SizeOf(new AccessibleContextInfo()));
Marshal.StructureToPtr(new AccessibleContextInfo(),acinfoPtr, true);
if (JABHelper.getAccessibleContextInfo(vmid, ctlContextPointer, acinfoPtr))
{
acinfo = (AccessibleContextInfo)Marshal.PtrToStructure(acinfoPtr, typeof(AccessibleContextInfo));
}
}
}
JABHelper只是WindowsAccessBridge.dll公开的不同接口的包装器。
ctlContextPointer-总是碰巧为零。任何有关此问题的决议都将受到高度赞赏。如果我做错了,也请告诉我。
答案 0 :(得分:1)
请在Oracle Forums上查看此代码。
检查您是否正确声明了所需的结构和功能,以及是否有其他功能可以获取可访问的上下文信息。
另外,请参阅GetAccessibleContextAt()
中AccessBridgeCalls.c
的定义(来自JavaFerret示例):
BOOL GetAccessibleContextAt(long vmID, AccessibleContext acParent,
jint x, jint y, AccessibleContext *ac)
这意味着WindowsAccessBridge.dll
期望指向您分配的内存,因此它将写入该内存。不要将IntPtr
对象作为最后一个参数传递,请尝试:
IntPtr retPtrForAC = Marshal.AllocHGlobal(Marshal.SizeOf(new Int32()));
result = JABHelper.getAccessibleContextAt(vmid, appContextPointer, x, y, out retPtrForAC);
还可以使用try catch块来检查异常。