2013-03-05 11 views
25

Ich arbeite an Windows, aber ich bin hier auf dem Mac stecken. Ich habe das Canon SDK und habe dafür einen JNA Wrapper gebaut. Es funktioniert gut unter Windows und benötigt etwas Hilfe mit Mac. In der SDK gibt es eine Funktion, wo man eine Callback-Funktion registrieren kann. Grundsätzlich tritt beim Auftreten eines Ereignisses in der Kamera die Callback-Funktion auf.Erhalten Sie Ereignisse von OS

Auf Fenstern, nach der Registrierung, ich brauche User32 zu verwenden, um das Ereignis zu bekommen und um das Ereignis zu versenden von:

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 
} 

Im api, ich habe nicht eine ähnliche Klasse in Mac zu finden. Wie gehe ich hier vor?

PS: Die JNAapi für Unix ist umfangreich und ich konnte nicht herausfinden, was zu suchen ist. Die könnte helfen

+0

Sie werden wahrscheinlich GCEventRef, prüfen wollen https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference .html –

+0

Die meisten JNA-Plattform-Mappings für Unix sind für X11, und es gibt nicht viel speziell für OS X. [Rococoa] (http://code.google.com/p/roccoako/) hat viel mehr von OS X-Mappings. – technomage

+0

@technomage Ich kann jetzt nicht nach Rococoa wechseln, weil ich dann den Code neu schreiben muss. Windows eins funktioniert schon gut. Ich brauche nur etwas Technik, um die Nachricht zu bekommen – Jatin

Antwort

3

Diese Lösung verwendet das Cocoa-Framework. Kakao ist veraltet und mir ist keine andere alternative Lösung bekannt. Aber das Folgende funktioniert wie Charme.

Schließlich fand ich die Lösung mit Carbon Framework. Hier ist meine MCarbon Schnittstelle, die Anrufe definiert, die ich brauche. Dies macht den Job

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

:

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 
    } 

Die Lösung des Problems wird unter Verwendung der folgenden Funktion gelöst. Gemäß Dokumentation -

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. 

Auch wenn nicht ReceiveNextEvent, dann andere Funktionen wie in MCarbon Klasse oben erwähnt wären nützlich.

Ich denke, Carbon Framework documentation würde mehr Erkenntnisse und Flexibilität geben, um das Problem zu lösen. Abgesehen von Carbon, in Foren haben Leute erwähnt, über die Verwendung von Cocoa zu lösen, aber keine mir bekannt ist.

Edit: Dank technomarge, weitere Informationen here

+0

Kühl. Schade, Carbon ist jedoch veraltet. –

+0

@AmigableClarkKant Eine andere Alternative? – Jatin

+0

Entschuldigung nein, nicht dass ich weiß. (Aber da könnte es sein.) –

Verwandte Themen