JNA を使用して、フレームワークを使用して Mac から OS イベントを受信する API を作成しましたCarbon
。現在、次のようにCarbon.framework
定義された関数があります。
OSStatus ReceiveNextEvent (
ItemCount inNumTypes, //ItemCount is a 32-bit iteration count
const EventTypeSpec *inList, //EventTypeSpec is a structure
EventTimeout inTimeout,//EventTimeout is double-length integer of type EventTime
Boolean inPullEvent,
EventRef *outEvent
);
ドキュメントには次のように書かれています。
inNumTypes
待機するイベント タイプの数 (イベントによってこの関数が返される場合は 0)。inList. 待機しているイベント タイプのリスト (イベントによってこの関数が返される場合は NULL を渡します)。
inTimeout 戻る前に待機する時間 (kEventDurationForever を渡すことをお勧めします)。
inPullEvent このパラメーターに true を渡して、次に一致するイベントをキューから削除します。
outEvent 渡されたリストに一致する次のイベントへのポインター。inPullEvent パラメーターで true を渡した場合、イベントは自分が所有しているため、完了したら解放する必要があります。
戻り値 イベントが受信されたか、タイムアウトが経過したか、または現在のイベント ループが終了したかを示す結果。可能な値については、「Carbon Event Manager Result Codes」 (257 ページ) を参照してください。討論
この関数は、指定されたタイプの次のイベントをフェッチしようとします。イベント キューに一致するイベントがない場合、この関数は、一致するイベントが到着するかタイムアウトになるまで、現在のイベント ループを実行します。タイマーが起動する場合を除いて、アプリケーションはこの関数内でイベントが到着するのを待ってブロックされます。
同じために、JNA呼び出しで以下を書きました:
NativeLong ReceiveNextEvent(NativeLong inNumTypes, EventTypeSpec[] inList,float inTimeout ,boolean inPullEvent, EdSdkLibrary.__EdsObject outEvent);
__EdsObject
伸びPointerType
ます。
public static class __EdsObject extends PointerType {
public __EdsObject(Pointer address) {
super(address);
}
public __EdsObject() {
super();
}
};
EventTypeSpec is:
public class EventTypeSpec extends Structure {
public int eventClass;
public int eventKind;
protected List getFieldOrder() {
return Arrays.asList(new String[]{"eventClass", "eventKind"});
}
}
そして呼び出しは次のとおりですcarbon.ReceiveNextEvent(new NativeLong(1), null, 1.0f, true, eventRef)
神はその理由を知っていますが、スレッドはステートメントから出てきません。興味深いのは、イベントを取得してディスパッチするが、出てこないことです。関数を定義した方法と関係がありますか?