【问题标题】:Intercept keydown events to NSWindow given to a plugin拦截给插件的 NSWindow 的 keydown 事件
【发布时间】:2018-02-21 08:05:40
【问题描述】:

我正在 OSX 上用 Objective-C 编写音频插件 (VST)。我的插件被加载到一个应用程序中,并被赋予一个 NSWindow 来添加我自己的 NSView。我需要能够截获 NSWindow 上的键盘事件,我可以部分做到这一点,但不能完全做到。

这是我迄今为止尝试过的:

  • 确保我的视图是第一个响应并处理 keyDown 事件。这适用于大多数 keyDown 事件,但不适用于回车或剪切/复制/粘贴等特殊键。

  • 使用 addLocalMonitorForEventsMatchingMask。这没有提供比 keyDown 更有用的东西。

我得到的 NSWindow 有一个菜单,其中包含一些用于剪切/复制/粘贴的关键等效项。如果用户在我的 NSView 中选择了某些内容,我偶尔需要拦截这些内容。如果用户正在输入一些数据,我偶尔也需要拦截回车。

我的 UI 是使用 OpenGL 呈现的,因此我没有使用标准 Cocoa UI 组件(除了 NSView 来托管我的 OpenGL 表面)。

我不希望用户必须启用任何特殊功能才能执行此操作,例如可访问性。

在我的 keyDown 处理程序中,我有这样的东西:

- (void)keyDown:(NSEvent*)event
{
    NSString* s = event.charactersIgnoringModifiers;

    unichar modified_key = 0;

    if (s && [s length] > 0)
    {
        modified_key = [s characterAtIndex:0];
    }

    if (modified_key == NSCarriageReturnCharacter)
    {
        // carriage return
    }
}

这适用于独立应用程序,但在作为音频插件托管时会失败。我认为的问题是托管插件的应用程序在事件到达我的事件处理程序之前拦截事件。

【问题讨论】:

  • 请出示您的关键事件处理代码。您谈论按键事件;要捕获您的关键等价物,您还需要处理 flagsChanged 。您如何尝试在 keyDown 中捕获回车?
  • @TheNextman,我从我的第一响应者视图中添加了一个示例 keyDown 处理程序。即使我将 addLocalMonitorForEventsMatchingMask 与 NSEventMaskKeyDown 一起使用并清除所有事件(以检查是否可以全部拦截),主机应用程序似乎仍然可以处理复制/粘贴。

标签: objective-c macos cocoa


【解决方案1】:

您似乎以一种奇怪的方式处理事件。直接处理NSEventkeyCode。您可以使用modifierFlags 获取修饰符。

这不适用于您需要访问权限的某些“系统”组合键(如 Command + Space)。

- (void)keyDown:(NSEvent *)event
{
    if (event.keyCode == 36)
        NSLog(@"you pressed return!");

    if (event.modifierFlags & NSEventModifierFlagCommand)
    {
        if (event.keyCode == 8)
            NSLog(@"you pressed command+c!");
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2021-06-27
    • 2019-06-04
    相关资源
    最近更新 更多