从操作系统获取事件

2022-09-01 19:34:45

我在Windows上工作,但我被困在Mac上。我有佳能SDK,并在其上构建了一个包装器。它在Windows上运行良好,需要Mac的一些帮助。在 sdk 中,有一个函数可以注册回调函数。基本上,当事件在相机中发生时,它会调用回调函数。JNA

在Windows上,注册后,我需要使用来获取事件并通过以下方式调度事件:User32

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
}

在api中,我在Mac中找不到类似的类。我该怎么做??

PS:unix的api很广泛,我不知道要找什么。该参考可能会有所帮助JNA


答案 1

此解决方案使用 Cocoa 框架。Cocoa已被弃用,我不知道任何其他替代解决方案。但下面的工作就像魅力一样。

最后,我找到了使用框架的解决方案。这是我的接口,它定义了我需要的调用。CarbonMCarbon

  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.

如果不是,那么上面类中提到的其他函数将是有用的。ReceiveNextEventMCarbon

我认为框架文档会提供更多的见解和灵活性来解决问题。除了 ,在论坛中,人们已经提到使用来解决,但我不知道。CarbonCarbonCocoa

编辑:感谢technomarge,更多信息在这里


答案 2