4

C#.net コードでは、interface-getAccessibleContextAtを次のように使用しようとしています。

  1. 問題の Java アプリケーションについて、メインのウィンドウ ハンドルを特定します。
  2. を使用して、アプリケーション コンテキストと vmid のポインターを取得しますgetAccessibleContextFromHWND。これらはゼロではなく、 getAccessibleContextFromHWNDtrue を返します。
  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- たまたま常にゼロです。この問題の解決策は高く評価されます。また、私が何か間違ったことをしている場合はお知らせください。

4

2 に答える 2

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 に答える