Отправить сочетание клавиш в окно Mac OS X - PullRequest
8 голосов
/ 16 января 2011

Возможно ли из одного окна на рабочем столе Mac программно отправить комбинацию клавиш или последовательность клавиш в другое?

Я хочу управлять приложением, которое не предлагает API для этого, используя функции сочетания клавиш приложения.

Я вполне уверен, что это можно сделать на Windows, но Mac?

Спасибо

Ответы [ 2 ]

15 голосов
/ 16 января 2011

Вы можете сделать это без необходимости также для 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);  
}
14 голосов
/ 16 января 2011

Один из способов сделать это - встроить Applescript в приложение Objective-C.Например, при выполнении этого сценария 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
...