【问题标题】:How to filter and override text input in Mac OS X如何在 Mac OS X 中过滤和覆盖文本输入
【发布时间】:2011-04-21 01:53:27
【问题描述】:

我正在尝试找出检测 OSX 中的用户是否在文本字段/区域中输入文本所需的 ObjC 代码。如果有的话,我想提供特殊的键绑定和文本扩展。我不是在写密钥嗅探器。

我已经尝试通过检测光标是否隐藏或光标模式是 IBeam 来执行此操作,但这不起作用。例如,误报情况是 Chrome 在切换选项卡时隐藏光标,因此用户未处于文本输入模式但光标​​已被隐藏。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 您要添加什么样的键绑定和自动补全? OS X 的文本系统已经非常强大,所以如果它不能满足您的需求,您需要注意不要做任何与现有键绑定和完成系统冲突的事情。此外,您的标签是多余的和冲突的。您想要 Cocoa 解决方案、Carbon 解决方案还是两者兼而有之?而且不需要appkit标签。
  • @Josh Caswell - 现已修复。抱歉,好久没来了:)
  • @user57368 - 我会采取任何解决方案。我认为不同的标签可能会吸引不同经验的人。

标签: objective-c cocoa macos macos-carbon


【解决方案1】:

我能够使用 Accessibility API 找到当前具有焦点的 UI 元素,然后查看它的角色描述以确定它是否是文本输入。

【讨论】:

  • 这个链接现在已经失效了,这就是为什么在你的答案中添加代码很有用。
【解决方案2】:

您可以通过创建自己的输入法来拦截和覆盖所有文本输入。您可以通过编程方式 (collection of 5 code samples) 或使用 text-based rule file(功能较弱的选项)来实现。

【讨论】:

  • 这是一个想法......但是,我想检测用户最初何时进入文本输入状态。我认为这种方法只会在输入文本后检测到。
【解决方案3】:

如果您想要通过 the Default Key Bindings dictionary 或 Snow Leopard 的内置文本替换功能来实现,您甚至可能不需要编写应用程序;对于后者,请参阅系统偏好设置中语言和文本窗格上的文本选项卡。

无法检测用户何时全局进入“文本输入”模式,因为这是在应用程序级别定义的。您可以在 AppKit 框架提供的文本系统中执行某些操作(如上),但您将无法影响不使用它的应用程序,例如 Adob​​e 的应用程序和 Flash 电影中的任何文本输入字段(例如,“为高分板输入你的名字:”)。唯一存在于系统范围内的是关键事件,它远低于文本输入的概念,以及安全文本模式[1],它仅适用于密码字段等内容。

[1]:TN2150 描述了“安全事件输入”模式的工作原理及其手动界面。大多数 (Cocoa) 应用程序只使用 NSSecureTextField,它为您完成了艰苦的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多