2013-03-05 2 views
25

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

На окнах, после регистрации, мне нужно использовать 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 
} 

В апи, я не нахожу подобный класс в Mac. Как мне это сделать?

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

+0

Вы, вероятно, хотите, чтобы проверить GCEventRef, https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference .html –

+0

Большинство сопоставлений платформы JNA для unix для X11, и для OS X не так уж много. [Rococoa] (http://code.google.com/p/rococoa/) имеет намного больше возможностей отображений OS X. – technomage

+0

@technomage Я не могу теперь перейти на Rococoa, потому что тогда мне придется переписать код. Windows уже работает отлично. Мне просто нужна техническая помощь, чтобы получить сообщение. – Jatin

ответ

3

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

Наконец-то я нашел решение, используя раму Carbon. Вот мой интерфейс 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 рамки documentation предоставили бы больше возможностей для понимания и гибкости, чтобы решить эту проблему. Помимо Carbon, в форумах люди упоминали о решении с использованием Cocoa, но я ничего не знаю.

Edit: Благодаря technomarge, больше информации here

+0

Прохладный. Слишком плохо Углерод не рекомендуется. –

+0

@AmigableClarkKant Любая другая альтернатива? – Jatin

+0

извините, нет, не то, что я знаю. (Но может быть.) –