2011-07-03 71 views
2

我一直在討論Java Access Bridge,並設法使其大部分工作,只有一個例外:我只能在Java窗口中掛鉤MouseClicked事件。Java Access Bridge C#:只有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文檔,源代碼和實例,調用約定和變量類型是兩個相同的。

我一直無法想出任何東西,我試圖使用documentation中提供的許多事件,但沒有任何工作。我在智慧的結局 - 即使是一個普遍的想法,對發生的事情會有所幫助。

注意:如果它是每種事件類型所需的特定方法,那麼我正在使用的方法是PropertyValueChangeFP,PropertySelectionChangeFP,PropertyTextChangeFP。

回答

0

您是否將函數指針設置爲回調函數?

/* Setup */ 
private void InitAccessBridge() 
{ 
    Windows_run(); 
    FocusGainedDelegate fgd= new FocusGainedDelegate(HandleFocusGained); 
    /* right here */ 
    setFocusGainedFP(fgd); 
} 
+0

是的,我是。事實上,出於某種原因,我使用的程序只會在奇怪的時間觸發這些事件。例如,僅當用戶停止輸入300毫秒左右時,纔會觸發AccessibleTextChanged。感謝您的幫助,並查看我最新的問題,以瞭解我最新的Java Access Bridge相關的頭痛問題:-P – HeWhoWas