Macos 如何在NSTextView中禁用查找(字典、同义词库、维基百科)功能?
我的一个项目是一个测试应用程序,在这个程序中,学生在打字时不应该很容易地查找单词 通过和在NSTextView中关闭自动拼写检查相对容易 我刚刚发现,学生在任何应用程序中都可以看到一个有用的窗口,其中包含一本词典、同义词表,甚至是一个维基百科条目(如果可以在那里找到这个词的话) 这对于99%的MacOS应用程序来说是非常好的功能,但不适合我的测试应用程序 几个月后,苹果公司为我提供了一个(未记录且微妙的)仅适用于10.8版本的解决方案,我可能最终会在下面的答案中提供它,但我需要一个同样适用于10.7版本的解决方案(这就是这个功能的来源) 针对这个问题,有三种可能的攻击计划,但我不确定如何处理这三种计划中的任何一种: (一) 我需要阻止此文本视图中出现此查找功能 (二) 我已经尝试删除字典首选项(如果存在;如果用户从未打开dictionary.app,则没有首选项)和字典缓存文件(在“Macos 如何在NSTextView中禁用查找(字典、同义词库、维基百科)功能?,macos,osx-lion,nstextview,appkit,quicklook,Macos,Osx Lion,Nstextview,Appkit,Quicklook,我的一个项目是一个测试应用程序,在这个程序中,学生在打字时不应该很容易地查找单词 通过和在NSTextView中关闭自动拼写检查相对容易 我刚刚发现,学生在任何应用程序中都可以看到一个有用的窗口,其中包含一本词典、同义词表,甚至是一个维基百科条目(如果可以在那里找到这个词的话) 这对于99%的MacOS应用程序来说是非常好的功能,但不适合我的测试应用程序 几个月后,苹果公司为我提供了一个(未记录且微妙的)仅适用于10.8版本的解决方案,我可能最终会在下面的答案中提供它,但我需要一个同样适用于1
~/Library/cache
”中),但这似乎没有改善情况
(三)
或者有没有一种方法可以检测到轨迹板的设置,即“在三指轻触时使用查找”?它可能在某个com.apple.*.plist的某个地方,或者通过“默认值”
”可以检测到,但我不确定在哪里
编辑:
只剩下一点时间希望解决这个问题并奖励奖金。以下是我尝试使用“默认值”
”的方法:
但我不能100%确定这些是正确的手势/关键词。即使在输入它们(并通过“defaults read com.apple.driver.applebluetoothmulti-touch.trackpad
”验证它们是否正确保存)之后,字典查找窗口仍然会出现
现在,这是唯一有效的方法,但它只在MacOS 10.8下有效(这些方法就是在MacOS 10.8下公开/引入的)。只需在NSTextView子类中重写这两个方法:
- (void)quickLookWithEvent:(NSEvent *)event;
- (void)quickLookPreviewItems:(id)sender;
我怀疑字典查找是通过以下两种方式之一实现的,即作为服务或通过
客户端
协议。因此,我将覆盖文本子类中的-validRequestStorForSendType:returnType:
,以查看是否为三指点击调用它。不管怎么说,对于你的应用程序来说,你似乎想为所有服务返回NO
。您还应该重写writeSelectionToPasteboard:types:
以返回NO
如果这样做不起作用,请尝试重写nstitputclient
的方法,查看是否正在调用它们。特别是,-attributedString
和-attributedSubstringForProposedRange:actualRange:
方法将是字典查找获取文本的方式。将这两个返回值设为nil将阻止它工作。请注意,NSPUTClient
协议对于输入法的使用以及对带有重音符号和变音符号的字符的按住访问至关重要,因此您可能会破坏这一点。我不知道您是否能够区分来自普通输入法的请求和来自字典查找手势的请求
如果所有其他操作都失败,您可以不使用
NSTextView
。这不是小事,但您可以完全控制它的行为。对一个类似问题的回答解决了这个问题,但没有抛出异常,因为它使用私有API:
只需在子类中覆盖
-(void)quickLookWithEvent:(NSEvent*)事件
,不处理该事件。当字典屏幕弹出时,转到文件(或者可能是编辑)/首选项并取消选中所有选项,以便不选中实际的字典选项,然后关闭应用程序,而且它不再偶尔出现——在大多数情况下——当尝试使用鼠标垫选择要复制和/或剪切的文本字符串时,它会出现,但不会像以前那样一直出现……重写“validRequestStorForSendType:returnType:
”在三指轻触时没有碰到断点或NSLogs。但是下面的段落--重写“属性substringorposeDrange:
”和“属性字符串”
”在执行TFT查找时都会命中。如果第一次调用失败,则“attributedString
”是调用的回退方法。为这两个值返回NULL将导致从“LUTSMDocumentTextAccessor
”引发“nsinternalinconsistenceexception
”,但应用程序将继续运行,不会出现崩溃或后续不良行为。这看起来很有希望,肯。我想知道缺点是什么?我能想到的唯一缺点是A)抛出异常,通常当抛出异常时,会出现后续崩溃。。。除非有什么东西抓住它。也许在查找架构中有某个地方正在捕获它?B) 我测试了我为我的应用程序的用户提供的所有文本和有限格式功能,除了三指点击查找之外,我看不到调用两个“attributedString
”方法。我希望这两个方法返回NULL不会意外地禁用应用程序中的某些内容。您的流程中是否存在异常?所讨论的方法与输入方法有关,输入方法实际上在一个单独的进程中运行。您可以尝试覆盖其他一些NSTEPUTClient
方法,看看是否可以说服dictionary lookup IM甚至不期望它能够获得字符串。另一种想法是,您可以覆盖-[NSView inputContext]
以返回nil
以完全禁用IMs。至于缺点,你试过亚洲即时通讯吗?你有吗
- (void)quickLookWithEvent:(NSEvent *)event;
- (void)quickLookPreviewItems:(id)sender;