我一直在搞乱 Java Access Bridge 并设法让它大部分工作,但有一个例外:我只能在 Java 窗口中挂钩 MouseClicked 事件。
这段代码:
[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);
}
上面的代码不会被触发,即使根据 oracle 文档、源代码和示例,调用约定和变量类型在两者中都是相同的。
我无法弄清楚任何事情,并且我尝试使用文档中提供的许多许多事件,但没有任何效果。我已经束手无策了——即使是对正在发生的事情有一个大致的了解也会有所帮助。
注意:如果它是每种事件类型所需的特定方法,我希望使用的是 PropertyValueChangeFP、PropertySelectionChangeFP、PropertyTextChangeFP。