objective-c – MacOS全球范围内的触控板压力

我试图通过以下代码获得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上出货.魔力触控板上也提供强制触控功能.

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

点赞