17

我的一个项目是一个测试应用程序,学生在打字时不应该能够轻松地查找单词。

setContinuousSpellCheckingEnabled:通过和关闭 NSTextView 中的自动拼写检查相对容易setAutomaticSpellingCorrectionEnabled:

我刚刚发现,学生只需用三根手指在任何应用程序中的任何选定单词上轻按,然后弹出一个有用的窗口,其中包含字典、同义词库甚至维基百科条目(如果可以在那里找到该单词),这都是非常简单的。

查找功能是什么样的

这对 99% 的 MacOS 应用程序来说都是很棒的功能,但不适用于我的测试应用程序。

几个月后,Apple 为我提供了一个仅适用于 10.8 的(未记录且微妙的)解决方案,我最终可能会在下面的答案中提供它,但我需要一个也适用于 10.7 的解决方案(其中是这个功能出现的地方)。

针对这个问题有三种可能的攻击计划,但我不确定如何处理这三种中的任何一种:

1)

我需要阻止此查找功能在此文本视图中发生。

2)

我已经尝试删除字典首选项(如果它们存在;如果用户从未打开 Dictionary.app,则没有首选项)和字典缓存文件(在“ ~/Library/Cache”中,但这似乎并没有改善这种情况。

3)

或者有没有办法能够检测到“使用三指点击时使用查找”的触控板设置?它可能在某个 com.apple.*.plist 某处或可通过“ defaults”检测到,但我不确定在哪里。

编辑:

只剩下一点时间来解决这个问题并奖励赏金了。这是我尝试使用“ 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”验证它们是否正确保存)之后,字典查找窗口仍然出现。

现在这是唯一有效的方法,但它仅在 MacOS 10.8 下有效(这是暴露/引入这些方法的地方)。只需在 NSTextView 子类中重写这两个方法:

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

3 回答 3

5

我怀疑字典查找是以两种方式之一实现的,作为服务或通过NSTextInputClient协议。所以,我会-validRequestorForSendType:returnType:在你的文本子类中重写,看看它是否被三指点击调用。无论如何,听起来您想要NO为所有服务返回您的应用程序。您还应该覆盖writeSelectionToPasteboard:types:以返回NO

如果这样做不行,请尝试覆盖 的方法NSTextInputClient以查看它们是否被调用。特别是,-attributedString-attributedSubstringForProposedRange:actualRange:方法将是字典查找获取文本的方式。使这两个返回nil应该阻止它工作。请注意,该NSTextInputClient协议对于输入法的使用以及对带有重音符号和变音符号的字符的按住访问至关重要,因此您可能会破坏它。我不知道您是否能够区分来自普通输入法的请求和来自字典查找手势的请求。

如果一切都失败了,您可以实现自定义文本视图,而不是使用NSTextView. 这不是微不足道的,但你可以完全控制它的行为。

于 2013-03-17T19:55:20.213 回答
0

This answer to a similar question解决了这个问题而不会抛出异常,但它使用私有API:https ://stackoverflow.com/a/20618984/959140

只需-(void)quickLookWithEvent:(NSEvent *)event在您的子类中覆盖并且不对事件执行任何操作。

于 2014-04-10T12:08:38.363 回答
0

当字典屏幕弹出时,转到文件(或者可能是编辑)/首选项并取消选中所有选项,以便不检查实际的字典选项,然后关闭应用程序,它不再显示 - 大多数情况下 -偶尔尝试使用鼠标垫选择一串文本进行复制和/或剪切时,它会出现,但不像以前那样经常出现......

于 2017-03-20T16:55:32.013 回答