[英]How do I go about handling Cocoa Events in a fullscreen application
我一直在尝试为可可豆创建一个没有笔尖/ xib的应用程序(不,我不想使用笔尖/ xib。我想以编程方式完全控制),而且似乎无法捕捉事件,例如击键和鼠标单击。 这是我到目前为止的代码:
的main.m
#import <Cocoa/Cocoa.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
NSApplication *app = [NSApplication sharedApplication];
AppDelegate *appDelegate = [[AppDelegate alloc] init];
[app setDelegate:appDelegate];
[app activateIgnoringOtherApps:YES];
[app run];
}
return EXIT_SUCCESS;
}
AppDelegate.h /米
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
NSWindow *window;
}
@end
#import "AppDelegate.h"
#import "GLView.h"
@implementation AppDelegate
- (id)init{
self = [super init];
if (!self) {
return nil;
}
NSRect bounds = [[NSScreen mainScreen] frame];
GLView *view = [[GLView alloc]initWithFrame:bounds];
window = [[NSWindow alloc] initWithContentRect:bounds
styleMask:NSBorderlessWindowMask
backing:NSBackingStoreBuffered
defer:NO];
[window setReleasedWhenClosed:YES];
[window setAcceptsMouseMovedEvents:YES];
[window setContentView:view];
return self;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[window makeKeyAndOrderFront:self];
}
@end
GLView.h /米
#import <Cocoa/Cocoa.h>
@interface GLView : NSView
@end
#import "GLView.h"
@implementation GLView
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect
{
// Drawing code here.
}
- (BOOL)canBecomeKeyView
{
return YES;
}
- (BOOL)acceptsFirstResponder
{
return YES;
}
- (BOOL)becomeFirstResponder
{
return YES;
}
- (BOOL)resignFirstResponder
{
return YES;
}
- (void)keyDown:(NSEvent *)theEvent
{
NSString* const character = [theEvent charactersIgnoringModifiers];
unichar const code = [character characterAtIndex:0];
NSLog(@"Key Down: %hu", code);
switch (code)
{
case 27:
{
EXIT_SUCCESS;
break;
}
}
}
- (void)keyUp:(NSEvent *)theEvent
{
}
@end
我尝试过的一切都没有奏效。 我认为通过将视图设置为第一响应者,我将能够获得事件。 到目前为止...没有工作。 关于如何解决此问题的任何想法? 记住,没有笔尖。
谢谢,泰勒
首先,您需要通过子类化并从canBecomeKeyWindow
返回YES
来确保窗口实际上可以成为关键,因为没有标题栏的窗口默认情况下不能成为关键 。
接下来,您的构建目标需要是一个应用程序。 我猜您是从Xcode中的命令行工具模板开始的。 很好,但是您需要产生一个应用程序捆绑包,以便您的应用程序接收关键事件。 在您的项目中创建一个新目标,该目标将构建一个Cocoa Application。 它需要有一个Info.plist文件(您将从中删除“ Main nib file base class”条目),并有一个“ Copy Bundle Resources”构建阶段。
我无法弄清楚构建过程中的所有其他区别是什么,但是从您的代码开始,我得到了接受这两个步骤的关键事件的窗口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.