У меня есть продукт Eclipse RCP, хорошо работающий с клавиатурой и мышью. Я хочу поддерживать нестандартное оборудование в моем продукте.
Чтобы включить устройство в продукт Eclipse RCP, я написал код JNI. Этот код JNI инициализирует устройство & драйвер (который работает правильно). После вызова этого метода JNI код приложения RCP начинает получать события в методе Display.readAndDispatch (). То, что я не понимаю, как получить эти события в моем классе виджетов. Все виджеты SWT имеют методы windowProc, которые обрабатывают события. Эти методы обрабатывают только предопределенные события, и они являются закрытыми (пакетные) методами, поэтому я не могу переопределить их.
В http://www.eclipse.org/articles/Article-Writing%20Your%20Own%20Widget/Writing%20Your%20Own%20Widget.htm На странице, в разделе родных виджетов, они объяснили, как добавить метод hookProc в код C ++. Я попытался сделать это следующим образом:
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 падает с кодом нарушения доступа.
Можете ли вы помочь мне с решением проблемы?
Хорошо, я наконец сделал это, добавив обработчик WindowProc в код Java, как показано ниже:
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 );
}
Таким образом, я смог обработать пользовательское событие в моем коде.
Других решений пока нет …