2

私は Java Access Bridge をいじり回してきましたが、Java ウィンドウ内でのみ MouseClicked イベントをフックできるという 1 つの例外を除いて、そのほとんどを機能させることができました。

このコード:

[DllImport("WindowsAccessBridge.dll", CallingConvention = CallingConvention.Cdecl)]
private extern static void setMouseClickedFP(MouseClickedDelegate fp);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void MouseClickedDelegate(System.Int32 vmID, IntPtr jevent, IntPtr ac);

static MouseClickedDelegate mcd;
mcd = new MouseClickedDelegate(HandleMouseClicked);

static void HandleMouseClicked(System.Int32 vmID, IntPtr jevent, IntPtr ac)
{
    getVersionInfo(vmID, out vi);
    releaseJavaObject(vmID, ac);
    releaseJavaObject(vmID, jevent);
}

問題なく動作します。Java ウィンドウが MouseClick を受け取るたびに、それを処理するコードもトリガーされます - 素晴らしいです。ただし、別のイベントをフックしようとすると、何も得られません。どんなイベントでも、何も受け取れません。次に例を示します。

[DllImport("WindowsAccessBridge.dll", CallingConvention = CallingConvention.Cdecl)]
private extern static void setFocusGainedFP(FocusGainedDelegate fp);

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void FocusGainedDelegate(System.Int32 vmID, IntPtr jevent, IntPtr ac);

static FocusGainedDelegate fgd;
fgd = new FocusGainedDelegate(HandleFocusGained);

static void HandleFocusGained(System.Int32 vmID, IntPtr jevent, IntPtr ac)
{
    AccessibleContextInfo aci = new AccessibleContextInfo();
    getAccessibleContextInfo(vmID, ac, out aci);
}

オラクルのドキュメント、ソース、および例によると、呼び出し規約と変数の型は両方で同一ですが、上記のコードはトリガーされません。

私は何も理解できず、ドキュメントで提供されている多くのイベントを使用しようとしましたが、何も機能していません。私は頭がおかしいです - 何が起こっているかについての一般的な考えでさえ助けになるでしょう.

注: 各イベント タイプに必要な特定のメソッドである場合、私が使用しようとしているのは、PropertyValueChangeFP、PropertySelectionChangeFP、PropertyTextChangeFP です。

4

1 に答える 1

0

関数ポインタをコールバックとして設定していますか?

/* Setup */
private void InitAccessBridge()
{
    Windows_run();
    FocusGainedDelegate fgd= new FocusGainedDelegate(HandleFocusGained);
    /* right here */
    setFocusGainedFP(fgd);
}
于 2011-08-16T12:49:22.237 に答える