此解决方案使用 Cocoa 框架。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
框架文档将为解决问题提供更多见解和灵活性。除了Carbon
,在论坛上人们提到了解决 using Cocoa
,但我不知道。
编辑:感谢technomarge ,这里有更多信息