如何创建NSScrollWheel类型的NSEvent?

时间:2011-05-25 14:40:13

标签: objective-c cocoa macos

我想构造(伪造)NSScrollWheel类型的NSEvent。有一些NSEvent构造函数方法用于其他几种类型的NSEvent(mouseEvent,keyEvent,enterExitEvent,otherEvent),但是没有一个允许我设置,例如deltaX。

4 个答案:

答案 0 :(得分:11)

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];

答案 1 :(得分:2)

您可以使用CGEventCreateScrollWheelEvent创建CGEventRef,并使用eventWithCGEvent:将其转换为NSEvent。要向CGEvent添加信息,请使用CGEventSetIntegerValueField - 可能kCGScrollWheelEventDeltaAxis1 ...2...3和{{1}}。

答案 2 :(得分:1)

请尝试以下代码:

  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);

答案 3 :(得分:0)

这对我来说是在2020年。我想我应该将Swift 5语法发布给任何找到此答案的人。如果按下⌘键,则NSScrollView子类中的此覆盖将交换上/下左右滚动行为:

public override func scrollWheel(with event: NSEvent) {
    guard event.modifierFlags.contains(.command) else {
        super.scrollWheel(with: event)
        return
    }

    if let cgEvent: CGEvent = event.cgEvent?.copy() {
        cgEvent.setDoubleValueField(.scrollWheelEventDeltaAxis1, value: Double(event.scrollingDeltaX))
        cgEvent.setDoubleValueField(.scrollWheelEventDeltaAxis2, value: Double(event.scrollingDeltaY))

        if let nsEvent = NSEvent(cgEvent: cgEvent) {
            super.scrollWheel(with: nsEvent)
        }
    }
}