Подтвердить что ты не робот

Получить события из ОС

Я работаю над окнами, но я застрял здесь на Mac. У меня есть SDK Canon, и над ним построена обертка JNA. Он хорошо работает на окнах и нуждается в некоторой помощи с Mac. В sdk существует функция, в которой можно зарегистрировать функцию обратного вызова. В основном, когда событие происходит в камере, оно вызывает функцию обратного вызова.

В окнах после регистрации мне нужно использовать User32, чтобы получить событие и отправить событие:

private static final User32 lib = User32.INSTANCE;
boolean hasMessage = lib.PeekMessage( msg, null, 0, 0, 1 ); // peek and remove
if( hasMessage ){
    lib.TranslateMessage( msg ); 
    lib.DispatchMessage( msg ); //message gets dispatched and hence the callback function is called
}

В api я не нашел аналогичный класс в Mac. Как это сделать?

PS: JNA api для unix обширна, и я не мог понять, что искать. Ссылка может помочь

4b9b3361

Ответ 1

Это решение использует структуру Cocoa. Cocoa устарел, и я не знаю другого альтернативного решения. Но ниже работает как шарм.

Наконец, я нашел решение, используя Carbon framework. Вот мой интерфейс MCarbon, который определяет нужные мне вызовы.

  public interface MCarbon extends Library {
  MCarbon INSTANCE = (MCarbon) Native.loadLibrary("Carbon", MCarbon.class);
  Pointer GetCurrentEventQueue();
  int SendEventToEventTarget(Pointer inEvent, Pointer intarget);
  int RemoveEventFromQueue(Pointer inQueue, Pointer inEvent);
  void ReleaseEvent(Pointer inEvent);
  Pointer AcquireFirstMatchingEventInQueue(Pointer inQueue,NativeLong inNumTypes,EventTypeSpec[] inList, NativeLong inOptions);
  //... so on
  }

Решение проблемы решается с помощью следующей функции:

 NativeLong ReceiveNextEvent(NativeLong inNumTypes, EventTypeSpec[] inList, double inTimeout, byte inPullEvent, Pointer outEvent);

Это делает работу. Согласно документации -

This routine tries to fetch the next event of a specified type.
If no events in the event queue match, this routine will run the
current event loop until an event that matches arrives, or the
timeout expires. Except for timers firing, your application is
blocked waiting for events to arrive when inside this function.

Также, если не ReceiveNextEvent, тогда полезны другие функции, упомянутые выше в классе MCarbon.

Я думаю, что Carbon framework documentation даст больше информации и гибкости для решения проблемы. Помимо Carbon, в форумах люди упоминают о решении с помощью Cocoa, но я ничего не знаю.

Изменить: Благодаря technomarge, подробнее здесь