【问题标题】:Handle Cmd-Q in Cocoa Application (and Menu Item 'Quit Application' programmatically)在 Cocoa 应用程序中处理 Cmd-Q(和菜单项“退出应用程序”以编程方式)
【发布时间】:2012-02-06 02:30:35
【问题描述】:

我创建了一个只有一个窗口的游戏应用程序。应用程序是在没有 .xib 文件帮助的情况下创建的,如下所述:How can I create a GUI and react to Cocoa events programmatically?

现在,我可以在应用程序的主循环中捕获标准的“向上/向下”事件:

 NSEvent* event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES];
 NSEventType eventType = [event type];
 if (eventType == NSKeyDown)
 {
    my_uint32 keycode = [event keyCode];
    input::doSomeWork(keycode);
 }

另外,我可以使用以下代码在窗口上按下红十字时正确退出应用程序:

- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{
    g_myEngine.stop();
    return NSTerminateNow;
}

但是我该怎么做:

a) 在选择菜单项“退出 MyApplicationName”时捕获?

b) 处理 Cmd-Q 事件?


更新: 我已添加此代码:

id menubar = [[NSMenu new] autorelease];
id appMenuItem = [[NSMenuItem new] autorelease];
[menubar addItem:appMenuItem];
[NSApp setMainMenu:menubar];
id appMenu = [[NSMenu new] autorelease];
id appName = [[NSProcessInfo processInfo] processName];
id quitTitle = [@"Quit " stringByAppendingString:appName];
id quitMenuItem = [[[NSMenuItem alloc] initWithTitle:quitTitle action:@selector(terminate:) keyEquivalent:@"q"] autorelease];
[appMenu addItem:quitMenuItem];
[appMenuItem setSubmenu:appMenu];

现在应用程序从菜单中退出,但 Cmd-Q 仍然不起作用。

【问题讨论】:

    标签: objective-c macos cocoa


    【解决方案1】:

    尝试设置菜单项的key equivalent modifier mask

    不要忘记添加关闭窗口、最小化、隐藏、进入/退出全屏等菜单项,以及整个编辑菜单,包括当前和未来的所有文本编辑功能。 (为什么是编辑菜单?我假设,至少,您将允许用户命名他们的存档游戏、他们的高分(如果适用)或他们的角色。如果您有任何文本编辑任何地方 em> 在应用程序中,您应该支持完整的编辑菜单。)

    【讨论】:

    • 谢谢,彼得。我稍后会试试这个。但是我使用的 keyEquivalent:@"q" 选项不做同样的事情吗?顺便说一句,感谢您就“编辑”菜单提供建议 - 我认为这是在 Mac AppStore 上被接受的要求。幸运的是游戏不需要用户输入任何文字。
    • @montonero:我应该认为你不需要设置它,但如果它不起作用,这是我尝试的第一件事。您还应该检查放置 Quit 菜单项的菜单,以查看它显示的等效键。
    • 好的,现在可以了,干杯!虽然,我还在输入处理中添加了一些代码,以便在按下 Cmd 时不“消耗”这些事件。
    猜你喜欢
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多