java — обрабатывает событие пользовательского устройства в Eclipse RCP

У меня есть продукт 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 падает с кодом нарушения доступа.
Можете ли вы помочь мне с решением проблемы?

0

Решение

Хорошо, я наконец сделал это, добавив обработчик 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 );
}

Таким образом, я смог обработать пользовательское событие в моем коде.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]