【问题标题】:Send a keyboard shortcut to a Mac OS X Window向 Mac OS X 窗口发送键盘快捷键
【发布时间】:2011-01-16 14:03:12
【问题描述】:

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

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

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

谢谢

【问题讨论】:

    标签: objective-c xcode macos keyboard-shortcuts


    【解决方案1】:

    您也可以在不需要 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);  
    }
    

    【讨论】:

    • 好主意,但 OP 如何将其发送到单独的目标进程?
    • 为什么这不能与 NX_KEYTYPE_PLAY 一起使用?它只是打印“y”
    【解决方案2】:

    一种方法是在您的 Objective-C 应用程序中嵌入 Applescript。 例如执行这个苹果脚本,发送 Command + MSystem 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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2011-06-10
    • 2012-08-13
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多