2016-01-27 41 views
0

我有一個Eclipse RCP產品,可以很好地處理鍵盤和鼠標。我想在我的產品中支持自定義硬件。 要在Eclipse RCP產品中啓用設備,我已經編寫了JNI代碼。此JNI代碼初始化設備&驅動程序(正在正常工作)。調用此JNI方法後,RCP應用程序代碼開始在Display.readAndDispatch()方法中接收事件。我不明白的是,如何將這個事件傳遞給我的widget類。所有SWT小部件都有處理事件的windowProc方法。這些方法只處理預定義的事件,它們是私有的(包私有)方法,所以我不能事件覆蓋它們。在Eclipse RCP中處理自定義設備事件

http://www.eclipse.org/articles/Article-Writing%20Your%20Own%20Widget/Writing%20Your%20Own%20Widget.htm頁面的本機窗口小部件中,他們解釋瞭如何在C++代碼中爲windowProc方法添加鉤子。我試圖以下列方式執行此操作:

JNIEXPORT jint JNICALL Java_com_aiit_iadss_framework_event_SpaceMouseEventManager_initInternal 
    (JNIEnv *env, jobject obj, jlong hwnd) 
{ 
     fprintf(stderr, "Initializing the space mouse module!"); 

     //code to init the device & driver 

     if(res > 0) 
     { 
      //the initialization was successful. Setup the 3D mouse event listener 
      WM_3DMOUSE = RegisterWindowMessage (_T("SpaceWareMessage00")); 

      //adding hook on RCP application window for WindowProc 
      oldProc = (WNDPROC) SetWindowLongPtr((HWND) hwnd, GWLP_WNDPROC, (long) WindowProc); 
     } 
     return res; 
} 

LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    int   num;  /* number of button returned */ 
    //SiSpwEvent  Event; /* 3DxWare Event */ 
    //SiGetEventData EData; /* 3DxWare Event Data */ 

    if(msg == WM_3DMOUSE) 
    { 
     fprintf(stderr, "Space mouse event caught!"); 
     return (TRUE); 
    } 
    //call windowproc to handle other events 
    return CallWindowProc(oldProc, hwnd, msg, wParam, lParam); 
} 

當我運行上面的代碼時,JVM與訪問衝突代碼崩潰。 你能幫我解決這個問題嗎?

回答

0

好吧,我終於通過增加如下的Java代碼的WindowProc處理這樣做:

Callback winprocCallback = new Callback(MyEventProcessingClass.class, "windowProc", 4); 
     MyEventProcessingClass.oldWinProc = OS.SetWindowLongPtr(shellHandle, OS.GWLP_WNDPROC, 
       winprocCallback.getAddress()); 

而且的WindowProc方法實現:

public static long windowProc(long hwnd, long msg, long wparam, long lParam) 
{ 
    if(msg == 'My device event id') 
    { 
     //process it & return 1; 
    } 
    return OS.CallWindowProc(SpaceMouseServiceImpl.oldWinProc, hwnd, (int) msg, wparam, lParam); 
} 

這樣我就能夠處理我的代碼中的自定義事件。