Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何创建NSScrollWheel类型的NSEvent?_Objective C_Cocoa_Macos - Fatal编程技术网

Objective c 如何创建NSScrollWheel类型的NSEvent?

Objective c 如何创建NSScrollWheel类型的NSEvent?,objective-c,cocoa,macos,Objective C,Cocoa,Macos,我想构造(伪造)一个NSScrollWheel类型的NSEvent。其他几种类型的NSEvent(MouseeEvent、keyEvent、EnterExiteEvent、otherEvent)都有NSEvent构造函数方法,但没有一种方法允许我设置,例如deltaX。您可以使用创建CGEventRef,并将其转换为NSEvent。要将信息添加到CGEvent,可以使用--kCGScrollWheelEventDeltaAxis1,…2,和…3,NSEvent不提供这样做的方法,但您可以创建CG

我想构造(伪造)一个NSScrollWheel类型的NSEvent。其他几种类型的NSEvent(MouseeEvent、keyEvent、EnterExiteEvent、otherEvent)都有NSEvent构造函数方法,但没有一种方法允许我设置,例如deltaX。

您可以使用创建
CGEventRef
,并将其转换为
NSEvent
。要将信息添加到
CGEvent
,可以使用--kCGScrollWheelEventDeltaAxis1,
…2
,和
…3
,NSEvent不提供这样做的方法,但您可以创建CGEvent并在其周围创建NSEvent包装。事件将自动使用光标的当前位置。看见但是,使用NSApplication的
postEvent:atStart:
发布此事件不起作用(可能是因为它没有定义窗口)。您可以将CGEvent直接发布到事件流,也可以将NSEvent直接发送到视图的
滚轮:
方法

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];
请尝试以下代码:

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

这是我在2020年想到的。我想我会为找到这个答案的人发布Swift 5语法。如果⌘ 键已关闭:

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