Как создать NSEvent типа NSScrollWheel?

Я хотел бы построить (подделку) NSEvent типа NSScrollWheel. Существуют методы конструктора NSEvent для нескольких других типов NSEvents (mouseEvent, keyEvent, enterExitEvent, otherEvent), но ни один из них не позволяет установить, например, deltaX.

Ответы

Ответ 1

NSEvent не предоставляет способ сделать это, но вы можете создать CGEvent и создать вокруг него обертку NSEvent. Событие автоматически будет использовать текущее местоположение курсора. См. CGEventCreateScrollWheelEvent. Однако размещение этого события с использованием NSApplication postEvent:atStart: не работает (возможно, потому, что оно не имеет определенного окна). Вы можете либо отправить CGEvent прямо в поток событий, либо отправить NSEvent непосредственно в метод вида scrollWheel:.

CGWheelCount wheelCount = 2; // 1 for Y-only, 2 for Y-X, 3 for Y-X-Z
int32_t xScroll = −1; // Negative for right
int32_t yScroll = −2; // Negative for down
CGEventRef cgEvent = CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitLine, wheelCount, yScroll, xScroll);

// You can post the CGEvent to the event stream to have it automatically sent to the window under the cursor
CGEventPost(kCGHIDEventTap, cgEvent);

NSEvent *theEvent = [NSEvent eventWithCGEvent:cgEvent];
CFRelease(cgEvent);

// Or you can send the NSEvent directly to a view
[theView scrollWheel:theEvent];

Ответ 2

Вы можете создать CGEventRef с помощью CGEventCreateScrollWheelEvent и преобразовать его в NSEvent с помощью eventWithCGEvent:. Чтобы добавить информацию в CGEvent, используйте CGEventSetIntegerValueField - среди возможных , kCGScrollWheelEventDeltaAxis1, ...2 и ...3.

Ответ 3

Попробуйте выполнить следующий код:

  int scrollingDeltaX =... //custom value

//if you have some NSEvent *theEvent 
  CGEventRef cgEvent = CGEventCreateCopy(theEvent.CGEvent);

  CGEventSetIntegerValueField(cgEvent, kCGScrollWheelEventDeltaAxis2, scrollingDeltaX);

  NSEvent *newEvent = [NSEvent eventWithCGEvent:cgEvent];
  CFRelease(cgEvent);