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()