Ответ 1
Это решение использует структуру Cocoa. Cocoa устарел, и я не знаю другого альтернативного решения. Но ниже работает как шарм.
Наконец, я нашел решение, используя Carbon
framework. Вот мой интерфейс 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
framework documentation даст больше информации и гибкости для решения проблемы. Помимо Carbon
, в форумах люди упоминают о решении с помощью Cocoa
, но я ничего не знаю.
Изменить: Благодаря technomarge, подробнее здесь