gpt4 book ai didi

objective-c - 如何在全屏应用程序中处理 Cocoa 事件

转载 作者:行者123 更新时间:2023-12-03 17:12:36 25 4
gpt4 key购买 nike

我一直在尝试为 Cocoa 创建一个没有 nib/xib 的应用程序(不,我不想使用 nib/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/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

我尝试过的方法都没有效果。我认为通过将 View 设置为第一响应者,我将能够获取事件。到目前为止...还没有工作。关于如何解决这个问题有什么想法吗?请记住,没有 NIB。

谢谢,泰勒

最佳答案

首先,您需要通过子类化并从 canBecomeKeyWindow 返回 YES 来确保您的窗口实际上可以成为关键,因为 windows without title bars cannot become key by default .

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

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

关于objective-c - 如何在全屏应用程序中处理 Cocoa 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17556990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com