NSDocument 和键盘(如 keyDown)

Posted

技术标签:

【中文标题】NSDocument 和键盘(如 keyDown)【英文标题】:NSDocument and keyboard (like keyDown) 【发布时间】:2009-10-06 15:55:33 【问题描述】:

我曾尝试阅读苹果文档,但在任何地方都找不到如何将关键事件(空格或其他)捕获到 NSDocument 应用程序中。

如果我理解得很好,使用 initialFirstRepsodner 是不可能的。

有什么想法吗?

谢谢大家! 安德烈亚

【问题讨论】:

我无法将 InitialFirstResponder 设置为文件的所有者...... 我相信developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/… 的信息应该适用于基于 NSDocument 的应用程序。 如果我理解得很好,那是不可能的...... 【参考方案1】:

我尝试阅读苹果文档,但在任何地方都找不到如何将关键事件(空格或其他)捕获到 NSDocument 应用程序中。

你想处理什么关键事件?你需要在某个地方实现keyDown:,但具体在哪里取决于你打算做什么。

【讨论】:

我必须使用空格键开始和停止视频捕获,并使用 Enter 键捕获帧。我已经在我的 NSDocument 类上实现了 keyDown,但我不知道在 nib 文件中定义第一响应者的位置。 你没有。请参阅我的此评论,其中我解释了 IB 中的 First Responder 图标:***.com/questions/598455/… 至于你的任务:听起来你想要一个全局热键。您根本不需要通过 Cocoa 响应者链来实现它,而是使用 Carbon Events 热键。 (尽管名称不同,但 64 位仍然支持这些。)还有一个名为 PTHotKey 的第三方类,它将基于 Cocoa 的 API 置于基于 Carbon 的 API 之上。 我需要使用 SPACE 和 ENTER 键,所以我认为使用热键是无法实现的。使用 captureOutput 从 Cam 获取帧并将其存储在 CImageBuffer 中,使用 ENTER 键将 CImageBuffer 保存在磁盘上。我需要空格键来开始和停止电影录制。 “我需要使用 SPACE 和 ENTER 键,所以我认为使用热键无法实现。”他们应该是。但为什么不让它们可定制呢?我认为几乎每个人都会自定义它们,因为否则他们将无法使用空间并进入您的应用程序之外。 (谁愿意切换回您的应用才能结束录制?)【参考方案2】:

如果你想捕捉到一个窗口的所有事件,你可以继承它并覆盖 -sendEvent:。如果要捕获整个应用程序中的所有事件,可以在 NSApplication 子类中重写相同的方法。

【讨论】:

我不清楚。我是 Cocoa 开发的新手。我正在使用 Apple 的 QTRecorder 示例,因此,如果我想处理所有事件,是否需要添加另一个作为 NSDocument 子类的类?【参考方案3】:

首先,我要感谢彼得的帮助!

我用过热键,这个示例非常有用!

http://dbachrach.com/blog/2005/11/program-global-hotkeys-in-cocoa-easily/

谢谢大家! 安德烈亚

【讨论】:

【参考方案4】:

首先你必须创建一个 NSWindow 的子类。 在 xcode 中执行:文件 -> 新文件 -> 目标 C 类。 取一个类似“NSWindowMyEvents”的名称。这将创建 2 个文件:.h 和 .m,转到 NSWindowMyEvents.h 并进行如下声明:

@interface NSWindowMyEvents : NSWindow 


保存更改并编译(以确保 IB 读取新标头 0,如果它已经打开)。

打开界面生成器并加载包含文档/主窗口的 nib/xib 文件。 确保文件所有者的“窗口”出口设置为您的主窗口。 单击您的主窗口(您要获取事件的窗口)并将其类(通过身份检查器 cmd+6)设置为:NSWindowMyEvents 而不是现在的 NSWindow。

保存更改!

回到 xcode 和 NSWindowMyEvents.m 并粘贴以下代码:

- (void)keyDown:(NSEvent *)theEvent

    NSLog(@"keyDown!");
    if ([[NSApp currentEvent] modifierFlags] & NSCommandKeyMask)
    
        NSLog(@"CommandKey Down!");
    

    [super keyDown:theEvent];

将事件发送到您想要的超级 IF,以将事件传递到其余响应者链。 您现在正在处理键盘事件。 同样,您可以处理 NSWindowMyEvent.m 中的任何事件

希望对您有所帮助....

【讨论】:

哦,可以用下面的代码来处理空格 ctr ... if([theEvent keyCode] == 36) ...(这是返回键)【参考方案5】:

我建议使用 NSUserDefaults 并存储您共享的全局键组合,然后根据这些存储的首选项检查 keyDown:,然后根据按下的键来执行操作。

即:#define kMyKeyCommand @"i"

【讨论】:

以上是关于NSDocument 和键盘(如 keyDown)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过按键盘上的一个键来防止调用多个 KeyDown 事件?

JQuery——键盘事件.keydown().keyup()和.keypress()

WinForm中的键盘按键 KeyDown,KeyPress和KeyUp事件

VB编程的键盘控制

javascript得到键盘keydown和keyup输入

如何在CodeMirror中触发键盘事件?