1

我一直在尝试为 Cocoa 创建一个没有 nib/xib 的应用程序(不,我不想使用 nib/xib。我想以编程方式完全控制)而且我似乎无法捕捉击键和鼠标点击等事件。这是我到目前为止的代码:

主程序

#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/m

#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/m

#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

我没有尝试过,因为它没有奏效。我认为通过将视图设置为第一响应者,我将能够获取事件。到目前为止......没有工作。关于如何解决这个问题的任何想法?记住,没有笔尖。

谢谢,泰勒

4

1 回答 1

1

首先,您需要确保您的窗口实际上可以成为 key,通过子类化和返回YESfrom canBecomeKeyWindow,因为默认情况下没有标题栏的窗口不能成为 key

接下来,您的构建目标需要是一个应用程序。我猜你是从 Xcode 中的命令行工具模板开始的。这很好,但是您需要生成一个应用程序包才能让您的应用程序接收关键事件。在您的项目中创建一个将构建 Cocoa 应用程序的新目标。它需要有一个 Info.plist 文件(您需要从中删除“主 nib 文件基类”条目)并有一个“复制捆绑资源”构建阶段。

我不太清楚构建过程中的所有其他差异,但从您的代码开始,我得到了通过这两个步骤接受关键事件的窗口。

于 2013-07-09T21:18:09.200 回答