5

在 Cocoa 应用程序中,我试图找到一种方法来捕获系统事件,例如通常使用 Cmd-Tab 或 Spotlight 启动的应用程序切换器,通常由 Cmd-Space 启动。我正在寻找一种方法来捕捉关键事件或任何其他方法来告诉我其中一个事件即将发生,最好取消它。

苹果屏幕共享远程桌面应用程序可以做到这一点,所以应该是可能的。它捕获这些事件并将它们发送到连接的远程计算机。

这是我已经尝试过的:

  • 在 NSApplication 中使用 sendEvent 方法捕获事件。我看到所有事件,如 Cmd 按键、Tab 按键,但是当两者都被按下时,我什么也看不到。
  • 注册一个 Carbon 热键监听器。我可以注册 Cmd+Q 之类的任何内容,但同样,当我注册 Cmd+Tab 时,它没有响应。

还有其他想法吗?

4

3 回答 3

2

找到了!在我的 WindowViewController.m 文件中

#import <Carbon/Carbon.h>

void *oldHotKeyMode;

- (void)windowDidBecomeKey:(NSNotification *)notification{
    oldHotKeyMode = PushSymbolicHotKeyMode(kHIHotKeyModeAllDisabled);
}
- (void)windowDidResignKey:(NSNotification *)notification{
    PopSymbolicHotKeyMode(oldHotKeyMode);
}

这太神奇了!它通过了 Mac App Store 的新 Apple 沙盒要求!

于 2011-09-27T15:46:53.363 回答
2

请参阅事件点击。

于 2011-06-02T19:34:50.187 回答
1

我将向您描述如何捕获 cmd+tab。但请注意,这仅适用于全屏模式。我相信在窗口模式下没有办法做到这一点。代码非常简单。这是 SDL mac 代码的一个小修复 - 用于在全屏模式下处理 cmd+tab 的更新。

NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask 
    untilDate:[NSDate distantPast] inMode:NSDefaultRunLoopMode dequeue:YES ];
    if ( event == nil ) {
        break;
    }
if (([event type] == NSKeyDown) && 
    ([event modifierFlags] & NSCommandKeyMask)
 &&([[event characters] characterAtIndex:0] == '\t')
{
     do something here
}
于 2011-06-27T20:43:34.473 回答