将键盘快捷方式发送到Mac OS X窗口

时间:2011-01-16 14:03:12

标签: objective-c xcode macos keyboard-shortcuts

Mac桌面上的一个窗口是否可以以编程方式将键盘快捷键或键序列发送给另一个窗口?

我希望通过使用应用程序的键盘快捷键功能来控制不提供API的应用程序。

我很确定这可以在Windows上完成,但Mac?

由于

2 个答案:

答案 0 :(得分:15)

您也可以在不需要AppleScript的情况下执行此操作。这是一个示例工作代码,它使用修饰符发送密钥代码。

-Edit:这不会让你瞄准特定的应用程序,只会将击键发布到整个系统(就像在键盘上按下一样)

#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 :(得分:14)

实现此目的的一种方法是在Objective-C应用程序中嵌入Applescript。 例如,执行此Apple脚本,将 Command + M 发送到System 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