Обнаружить 3 пальца жест рукой даже вне окна приложения MacOS вечно

Как я могу обнаружить жест 3 пальцев на моем максовом трекдере на экране (не только в моем окне приложения) постоянно (без фокуса на моем окне приложения)?

Спасибо!

Ответ 1

Вы можете использовать GlobalMonitorForEvents -

устанавливает монитор событий, который получает копии событий, отправленных в других приложений. События передаются асинхронно в ваше приложение и вы можете наблюдать за событием

https://developer.apple.com/reference/appkit/nsevent/1535472-addglobalmonitorforevents

И добавьте счетчик в обратном вызове для числа нажатий.

Ответ 2

M5MultitouchSupport может быть решением вашей проблемы.

Сначала установите и добавьте библиотеку в свой проект: pod 'M5MultitouchSupport' (или посетите сайт проекта здесь), а затем создайте такой код (+ #import <M5MultitouchSupport.h>):

[M5MultitouchManager.sharedManager addListenerWithCallback:^(M5MultitouchEvent *event) {
  NSLog(event.description);
}];

И вывод будет:

"ID: 3, State: 4 (Touching), Position: [0.251363, 0.475246], Velocity: [0.009912, -0.003619], Minor Axis: 8.160000, Major Axis: 9.920000, Angle: 1.911052, Size: 0.750000",
"ID: 6, State: 4 (Touching), Position: [0.618595, 0.839751], Velocity: [-0.007434, -0.014476], Minor Axis: 8.230000, Major Axis: 9.220000, Angle: 1.570796, Size: 0.625000",
"ID: 8, State: 4 (Touching), Position: [0.410051, 0.792415], Velocity: [0.008673, 0.018095], Minor Axis: 7.660000, Major Axis: 8.890000, Angle: 1.570796, Size: 0.628906"

Теперь я еще не тестирую его, но теоретически он должен работать.

EDIT:

Также, чтобы получить другую информацию:

/** Identifier of touch, persistent/applicable across events. */
@property (assign, readonly) int identifier;

/** Current state of touch. 0 is not touching, anything else is some kind of touching. */
@property (assign, readonly) M5MultitouchTouchState state;

/** Coordinates of touch (each value 0 -> 1, so basically percent of touch surface). */
@property (assign, readonly) float posX, posY;

/** Coordinates of touch (each value 0 -> 1, so basically percent of touch surface). */
@property (assign, readonly) float velX, velY;

/** Minor and major axis of touch. */
@property (assign, readonly) float minorAxis, majorAxis;

/** Angle of touch (angle of finger tip from north). */
@property (assign, readonly) float angle;

/** Size of touch (finger tip surface area touching). */
@property (assign, readonly) float size;

Итак:

NSLog(event.size); // Get size
NSLog(event.angle); // Get angle
NSLog(event.state); // Get state (4 = touching)
NSLog(event.posX); // get position x or y

Ответ 3

"Три пальца, чистящие по поверхности трекпада в общем направлении, являются жестом салфетки"

Вы можете использовать ниже фрагмент кода.

-(NSSet *)touchesMatchingPhase:(NSTouchPhase)phase inView:(NSView *)view;

Панель предпочтений трекпада включает в себя опцию для жестов прокрутки: два пальца перемещают представление содержимого прокрутки. Технически, жестов прокрутки - это не конкретные жесты, а события мыши. В отличие от жестов, событие колеса прокрутки (то есть событие типа NSScrollWheel) может иметь как свойство фазы, так и свойство momentumPhase. Свойство momentumPhase помогает вам обнаруживать прокрутку импульса, при котором аппаратное обеспечение продолжает выдавать события с колесиком прокрутки, даже если пользователь больше не выполняет физическую прокрутку. Такие устройства, как Magic Mouse и Multi-Touch, позволяют прокручивать импульсы.

Вы можете увидеть дополнительную информацию HandlingTouchEvents

Ответ 4

Чтобы разрешить мониторинг глобальных событий, вам необходимо включить приложение в качестве доверенного. Он не будет работать в среде песочницы, и поэтому в магазине приложений.

 NSDictionary *options = @{(__bridge id) kAXTrustedCheckOptionPrompt : @YES};
 AXIsProcessTrustedWithOptions((__bridge CFDictionaryRef) options);

Чтобы проверить:

BOOL trusted = AXIsProcessTrusted(); NSLog(@"Trusted Process: %d", trusted);

Вот всеобъемлющая проницательность.