【发布时间】:2011-01-16 14:03:12
【问题描述】:
Mac 桌面上的一个窗口是否可以通过编程方式向另一个窗口发送键盘快捷键或键序列?
我希望通过使用应用程序的键盘快捷键功能来控制不提供 API 的应用程序。
我很确定这可以在 Windows 上完成,但是在 Mac 上呢?
谢谢
【问题讨论】:
标签: objective-c xcode macos keyboard-shortcuts
Mac 桌面上的一个窗口是否可以通过编程方式向另一个窗口发送键盘快捷键或键序列?
我希望通过使用应用程序的键盘快捷键功能来控制不提供 API 的应用程序。
我很确定这可以在 Windows 上完成,但是在 Mac 上呢?
谢谢
【问题讨论】:
标签: objective-c xcode macos keyboard-shortcuts
您也可以在不需要 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);
}
【讨论】:
一种方法是在您的 Objective-C 应用程序中嵌入 Applescript。
例如执行这个苹果脚本,发送 Command + M 到System Events application:
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
【讨论】: