4

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

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

4

2 回答 2

1

在Oracle 论坛上查看此代码。

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

此外,请参阅GetAccessibleContextAt()in的定义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 块来检查异常。

于 2014-12-11T05:49:14.960 回答
0
[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));


于 2020-01-20T08:06:47.693 回答