向 Mac OS X 窗口发送键盘快捷键

9

在Mac桌面上,一个窗口能否通过编程的方式向另一个窗口发送键盘快捷键或按键序列?

我想通过使用应用程序的键盘快捷键功能来控制一个没有API的应用程序。

我相当确定这可以在Windows上完成,但是在Mac上呢?

谢谢

2个回答

17

您可以不使用AppleScript实现这个功能。以下是一个示例工作代码,它可以发送带修饰键的按键代码。

-编辑:这样做不会让您针对特定应用程序进行操作,只能将按键信息发送到整个系统(就像在键盘上按下一样)。

#include <ApplicationServices/ApplicationServices.h>
// you can find key codes in <HIToolbox/Events.h>, for example kVK_ANSI_A is 'A' key
// modifiers are flags such as kCGEventFlagMaskCommand

void PostKeyWithModifiers(CGKeyCode key, CGEventFlags modifiers)
{
        CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);

        CGEventRef keyDown = CGEventCreateKeyboardEvent(source, key, TRUE);
        CGEventSetFlags(keyDown, modifiers);
        CGEventRef keyUp = CGEventCreateKeyboardEvent(source, key, FALSE);

        CGEventPost(kCGAnnotatedSessionEventTap, keyDown);
        CGEventPost(kCGAnnotatedSessionEventTap, keyUp);

        CFRelease(keyUp);
        CFRelease(keyDown);
        CFRelease(source);  
}

1
不错的想法,但是 OP 如何将其发送到单独的目标进程? - BigBrother
为什么使用NX_KEYTYPE_PLAY无法工作?它只是打印“y”。 - jLynx

14

一种方法是将Applescript嵌入到您的Objective-C应用程序中。 例如,执行此apple脚本会发送 Command + MSystem Events 应用程序:

tell application "System Events" to keystroke "m" using {command down}
您可以像下面这样在您的Cocoa应用程序中嵌入上面的脚本:
//AppControler.h
#import <Cocoa/Cocoa.h>

@interface AppController : NSObject {
    NSAppleScript *key;
}
-(IBAction)sendkeys:(id)sender;
@end

//AppControler.m
#import "AppController.h"

@implementation AppController

-(IBAction)sendkeys:(id)sender
{
    NSAppleScript *key = [[NSAppleScript alloc] initWithSource:@"tell application "System Events" to keystroke "m" using {command down}"];
    [start executeAndReturnError:nil];
}

@end

太好了。对于其他人来说,苹果关于AppleScript的文档看起来很有用。非常感谢。 - Adam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接