Java访问桥 - 使用getAccessibleContextAt时出现问题

时间:2013-11-21 05:55:52

标签: java java-access-bridge

在C#.net代码中,一直尝试以下列方式使用interface getAccessibleContextAt

  1. 对于所关注的Java应用程序,我确定了主要的windows-handle
  2. 我使用getAccessibleContextFromHWND获取应用程序上下文和vmid的指针。这些不为零,getAccessibleContextFromHWND返回true。
  3. 使用这些值和鼠标位置(x,y)尝试使用接口getAccessibleContextAt获取基础控件的上下文。此方法返回true,但控件的指针为零。
  4. 以下是我正在使用的代码:

    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-总是碰巧为零。任何有关此问题的决议都将受到高度赞赏。如果我做错了,也请告诉我。

1 个答案:

答案 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块来检查异常。