使用 JNA,我构建了一个 api 来使用Carbon
框架从 Mac 接收操作系统事件。现在,有一个函数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)。在列表中。我们正在等待的事件类型列表(如果任何事件应该导致此函数返回,则传递 NULL)。
inTimeout 返回前等待的时间(最好通过 kEventDurationForever)。
inPullEvent 为该参数传递 true 以从队列中移除下一个匹配事件。
outEvent 指向与传入列表匹配的下一个事件的指针。如果您在 inPullEvent 参数中传递 true,则该事件归您所有,完成后您应该释放它。
返回值 指示是否接收到事件、超时到期或退出当前事件循环的结果。有关可能的值,请参见“碳事件管理器结果代码”(第 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)
天知道为什么,但这条线索并没有从声明中出来。有趣的是,它确实会获取事件并分发它们,但不会出来。它与我定义函数的方式有关吗?