2013-03-05 25 views
25

Tôi làm việc trên các cửa sổ nhưng tôi bị kẹt ở đây trên Mac. Tôi có Canon SDK và đã xây dựng một wrapper JNA trên nó. Nó hoạt động tốt trên các cửa sổ và cần trợ giúp với Mac. Trong sdk, có một chức năng mà người ta có thể đăng ký một chức năng gọi lại. Về cơ bản khi một sự kiện xảy ra trong máy ảnh, nó gọi hàm gọi lại.Nhận sự kiện từ OS

Trên cửa sổ, sau khi đăng ký, tôi cần phải sử dụng User32 để có được sự kiện này và để gửi sự kiện này bằng cách:

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 
} 

Trong api, tôi không tìm thấy một lớp học tương tự trong Mac. Làm thế nào để tôi đi về cái này ??

PS: JNAapi cho unix là mở rộng và tôi không thể tìm ra điều cần tìm. reference có thể giúp

+0

Bạn có thể sẽ muốn kiểm tra GCEventRef, https://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference .html –

+0

Hầu hết các ánh xạ nền tảng của JNA cho unix là dành cho X11 và không có nhiều đặc trưng cho OS X. [Rococoa] (http://code.google.com/p/rococoa/) có nhiều tính năng hơn bằng cách của ánh xạ OS X. – technomage

+0

@technomage Tôi không thể chuyển sang Rococoa vì sau đó tôi sẽ phải viết lại mã. Windows đã hoạt động tốt. Tôi chỉ cần một số kỹ thuật để nhận được thông báo – Jatin

Trả lời

3

Giải pháp này đang sử dụng khung công thức Cocoa. Ca cao không được chấp nhận và tôi không biết về bất kỳ giải pháp thay thế nào khác. Nhưng bên dưới hoạt động như sự quyến rũ.

Cuối cùng tôi tìm thấy giải pháp sử dụng khung Carbon. Đây là giao diện MCarbon của tôi để xác định các cuộc gọi mà tôi cần.

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 
    } 

Các giải pháp cho vấn đề được giải quyết bằng cách sử dụng chức năng dưới đây:

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

này không được công việc. Theo tài liệu hướng dẫn -

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. 

Ngoài ra nếu không ReceiveNextEvent, chức năng thì khác như đã đề cập trong MCarbon lớp trên sẽ có ích.

Tôi nghĩ rằng Carbon khuôn khổ documentation sẽ cung cấp thêm thông tin chi tiết và linh hoạt để giải quyết vấn đề. Ngoài số Carbon, trong các diễn đàn, mọi người đã đề cập đến việc giải quyết bằng cách sử dụng Cocoa, nhưng không có gì tôi biết.

Edit: Nhờ technomarge, biết thêm thông tin here

+0

Tuyệt. Tuy nhiên, Carbon quá xấu sẽ bị phản đối. –

+0

@AmigableClarkKant Bất kỳ giải pháp thay thế nào khác? – Jatin

+0

xin lỗi không, không phải là tôi biết. (Nhưng có thể có.) –