objective-c - MacOS 全局获取触控板压力

标签 objective-c macos trackpad

我正在尝试使用以下代码获取 MacBook Pro 触控板压力:

CGEventRef eventTapCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef eventRef, void *refcon) {
    NSEvent *event = [NSEvent eventWithCGEvent:eventRef];

    NSLog(@"%lld", (int64_t)CGEventGetIntegerValueField(eventRef, kCGMouseEventPressure)); // returns 0
    NSLog(@"%lld", (int64_t)CGEventGetIntegerValueField(eventRef, kCGTabletEventPointPressure)); // returns 0
    NSLog(@"%lld", (int64_t)CGEventGetIntegerValueField(eventRef, kCGTabletEventTangentialPressure)); // returns 0

    NSLog(@"%f", [event pressure]); // Assertion failure

    return eventRef;
}

你知道怎么做吗?

最佳答案

如果设备支持压力数据(即压力触控板),则压力数据可用。大约从 2015 年开始,MacBook 就开始配备力度触控板。Magic Trackpad 也提供力度触控。

This blog post有一种检测力触摸设备的方法,虽然我没有尝试。

我的机器是带有力度触控板的 2016 MacBook Pro。我可以使用此代码获得压力:

[self.window trackEventsMatchingMask:NSEventMaskPressure 
    timeout:NSEventDurationForever 
    mode:NSEventTrackingRunLoopMode 
    handler:^(NSEvent * _Nonnull event, BOOL * _Nonnull stop) {
        NSLog(@"%f", event.pressure);
    }];

输出:

2018-02-09 18:16:10.986036-0800 forcetouch[4587:4164200] 0.437820
2018-02-09 18:16:10.993772-0800 forcetouch[4587:4164200] 0.457504
2018-02-09 18:16:11.001883-0800 forcetouch[4587:4164200] 0.476486
2018-02-09 18:16:11.010654-0800 forcetouch[4587:4164200] 0.494812
2018-02-09 18:16:11.017738-0800 forcetouch[4587:4164200] 0.512497
2018-02-09 18:16:11.028129-0800 forcetouch[4587:4164200] 0.529556
2018-02-09 18:16:11.033769-0800 forcetouch[4587:4164200] 0.546021
2018-02-09 18:16:11.042117-0800 forcetouch[4587:4164200] 0.561905
2018-02-09 18:16:11.049869-0800 forcetouch[4587:4164200] 0.577240

但是,我看到您正在使用事件点击。

我尝试了您的代码,当我检查 kCGMouseEventPressure 时,我得到了 1。当我检查 event.pressure 时,我也会得到 1。所以我收到了一个你没有的值——我猜你没有强制触摸硬件?但是我没有收到实际的压力值。

我不确定如何使用事件点击来获取它。

这适用于我的 2016 MacBook Pro。请注意,这台机器有一个强制触摸触控板。我不确定这会在没有强制触摸触控板的机器上返回什么。但希望这能给您带来更多想法。

Force touch for developers

NSEvent - pressure

关于objective-c - MacOS 全局获取触控板压力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25803591/

相关文章:

ios - CAAnimation 获取动画属性的实时更新

ios - 在类型 'remoteMessageDelegate' 的对象上找不到属性 'FIRMessaging *'

c - 如何在 OSX Lion 上模仿 GNU/linux C 开发环境?

macos - 如何在 OSX 上使用 TAR 排除目录?

objective-c - 如何使用 OS X 10.10 Storyboard指定弹出窗口上箭头的来源

iphone - 搜索核心数据

ios - 当我转到 Debug模式时,Pods 中的 .a 文件变为红色

java - Libgdx - 如何为每个部分的不同输入处理器拆分屏幕

jquery - 检查用户是否使用触控板滚动?

c# - WPF - 在 Macbook pro 触控板上的两指水平滚动