Как отключить функциональность LookUp (Словарь, Тезаурус, Википедия) в NSTextView? - программирование
Подтвердить что ты не робот

Как отключить функциональность LookUp (Словарь, Тезаурус, Википедия) в NSTextView?

Один из моих проектов - это тестовое приложение, в котором ученик не должен легко искать слова во время их ввода.

Относительно легко отключить автоматическую проверку орфографии в NSTextView с помощью setContinuousSpellCheckingEnabled: и setAutomaticSpellingCorrectionEnabled:.

Я только что обнаружил, что для студентов очень тривиально просто коснуться тремя пальцами по любому выбранному слову в любом приложении и всплывает полезное окно содержащий словарь, тезаурус и даже запись в Википедии, если там можно найти слово.

What Lookup functionality looks like

Это отличная функциональность для 99% приложений MacOS, но не подходит для моего тестового приложения.

Теперь, спустя несколько месяцев, Apple предоставила мне (недокументированное и тонкое) решение, которое работает только для 10.8, и я могу в конечном итоге предоставить его в ответах ниже, но мне нужно, чтобы иметь решение, которое работает и для 10.7 (именно там и появилась эта функциональность).

Есть три возможных плана атаки на эту проблему, но я не уверен, как подойти к любому из этих трех:

1)

Мне нужно заблокировать эту функцию Lookup в этом текстовом представлении.

2)

Я уже пытался удалить настройки словаря (если они существуют, если пользователь никогда не открывал Dictionary.app, нет никаких предпочтений) и файлы кеша словаря (в "~/Library/Cache", но это не похоже, улучшают ситуацию.

3)

Или есть ли способ обнаружить параметр трекпада, который говорит "Использовать поиск при выполнении трех пальцевого крана"? Это возможно в некотором com.apple. *. Plist где-то или обнаруживается через "defaults", но я не уверен, где.

EDIT:

Осталось только немного времени, чтобы, надеюсь, решить эту проблему и наградить щедростью. Вот такой подход, который я пытался с помощью defaults ":

defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerTapGesture -bool false
defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad TrackpadThreeFingerDoubleTapGesture -bool false

Но я не на 100% уверен, что это правильные жесты/ключевые слова для ввода. И даже после их ввода (и проверки они были правильно сохранены с помощью "defaults read com.apple.driver.AppleBluetoothMultitouch.trackpad" ), окно LookUp словаря все еще появляется.

Теперь это единственное, что работает, но оно работает только под MacOS 10.8 (где эти методы были выставлены/привезены). Просто переопределите эти два метода в подклассе NSTextView:

- (void)quickLookWithEvent:(NSEvent *)event;
- (void)quickLookPreviewItems:(id)sender;
4b9b3361

Ответ 1

Я подозреваю, что поиск словаря реализован одним из двух способов: службой или протоколом NSTextInputClient. Поэтому я бы переопределил -validRequestorForSendType:returnType: в вашем подклассе текста, чтобы узнать, вызван ли он для трех пальцевого крана. В любом случае, это похоже на приложение, которое вы хотите вернуть NO для всех служб. Вы также должны переопределить writeSelectionToPasteboard:types:, чтобы вернуть NO.

Если это не так, попробуйте переопределить методы NSTextInputClient, чтобы узнать, вызваны ли они. В частности, методы -attributedString и -attributedSubstringForProposedRange:actualRange: - это то, как поиск словаря получает текст. Создание обоих возвратов nil должно помешать работе. Имейте в виду, что протокол NSTextInputClient имеет центральное значение для использования методов ввода и доступа к символам с акцентами и диакритикой нажатием и удержанием, поэтому вы можете это сломать. Я не знаю, сможете ли вы отличить запросы от обычного метода ввода и от жестов поиска словаря.

Если все остальное не удается, вы можете реализовать пользовательский текстовый вид вместо использования NSTextView. Это не тривиально, но вы будете иметь полный контроль над его поведением.

Ответ 2

Этот ответ на аналогичный вопрос устраняет проблему, не исключая исключения из компромиссов с использованием частного API: fooobar.com/questions/374953/...

Просто переопределите -(void)quickLookWithEvent:(NSEvent *)event в вашем подклассе и ничего не делайте с этим событием.

Ответ 3

Когда откроется окно "Словарь", перейдите в "Файл" (или, возможно, это было редактирование)/ "Установки", и снимите флажок со всех параметров, чтобы не проверять фактические параметры словаря и закрыть приложение, и оно больше не отображается - для большая часть - время от времени, пытаясь использовать коврик для мыши, чтобы выбрать строку текста для копирования и/или резки, она появляется, но не постоянно, как раньше...