【问题标题】:Java access bridge- issue while using getAccessibleContextAt使用 getAccessibleContextAt 时出现 Java 访问桥问题
【发布时间】:2013-12-05 11:39:54
【问题描述】:

在C#.net代码中,一直在尝试以如下方式使用接口-getAccessibleContextAt

  1. 对于相关的 Java 应用程序,我确定了主窗口句柄
  2. 我使用getAccessibleContextFromHWND 获得了应用程序上下文和vmid 的指针。这些不是零,getAccessibleContextFromHWND 返回 true。
  3. 使用这些值和鼠标位置 (x,y) 尝试使用接口 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- 总是碰巧为零。对此问题的任何解决方案将不胜感激。如果我做错了什么也请告诉我。

【问题讨论】:

    标签: java java-access-bridge


    【解决方案1】:

    Oracle Forums 上查看此代码。

    检查您是否正确声明了所需的结构和函数,以及获取可访问上下文信息的其他函数是否正常工作。

    另外,参见AccessBridgeCalls.cGetAccessibleContextAt() 的定义(来自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 块来检查异常。

    【讨论】:

      【解决方案2】:
      [DllImport("WindowsAccessBridge-64.dll", SetLastError = true, ThrowOnUnmappableChar = true, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
      public extern static unsafe Boolean getAccessibleContextAt(long vmID, IntPtr acParent, Int32 x, Int32 y, out IntPtr ac);```
      
      [DllImport("WindowsAccessBridge-64.dll", SetLastError = true, ThrowOnUnmappableChar = true, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
      public extern static unsafe Boolean getAccessibleContextInfo(Int32 vmID, IntPtr accessibleContext, IntPtr acInfo);
      
      --get the control handle using below line of code
      --Used @Deepak answer reference
      
      IntPtr retPtrForAC = Marshal.AllocHGlobal(Marshal.SizeOf(new Int32()));
      JabApi.getAccessibleContextAt(vmID, CurrentPtr, Xcord, Ycord, out retPtrForAC);
      
      
      --Now get the Accessible context from retPtrForAC
      IntPtr acPtr = Marshal.AllocHGlobal(Marshal.SizeOf(new AccessibleContextInfo()));
      JabApi.getAccessibleContextInfo(vmID, retPtrForAC, acPtr);
      var accessibleContextInfo = (AccessibleContextInfo)Marshal.PtrToStructure(acPtr, typeof(AccessibleContextInfo));
      
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-27
        • 2010-10-03
        • 2021-07-02
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        相关资源
        最近更新 更多