小编Jam*_*rop的帖子

addGlobalMonitorForEventsMatchingMask无法正常工作

我无法获得支持辅助的应用程序(开发案例中的XCode)来捕获全局keyDown事件.我已经看到了很多代码示例,如下所示,但这对我来说不适用于10.9.4.

#import <AppKit/AppKit.h>
#import <Foundation/Foundation.h>

// 10.9+ only, see this url for compatibility:
// http://stackoverflow.com/questions/17693408/enable-access-for-assistive-devices-programmatically-on-10-9
BOOL checkAccessibility()
{
  NSDictionary* opts = @{(__bridge id)kAXTrustedCheckOptionPrompt: @YES};
  return AXIsProcessTrustedWithOptions((__bridge CFDictionaryRef)opts);
}

int main(int argc, const char * argv[])
{
  @autoreleasepool {
    if (checkAccessibility()) {
        NSLog(@"Accessibility Enabled");
    }
    else {
        NSLog(@"Accessibility Disabled");
    }

    NSLog(@"registering keydown mask");
    [NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
                                           handler:^(NSEvent *event){
                                               NSLog(@"keydown: %@", event.characters);

                                           }];

      NSLog(@"entering run loop.");
      [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

收到的输出是:

2014-08-25 17:26:36.054 test[64725:303] Accessibility Enabled
2014-08-25 17:26:36.055 test[64725:303] registering …
Run Code Online (Sandbox Code Playgroud)

macos cocoa

10
推荐指数
1
解决办法
3846
查看次数

如何在Swift中从CFTypeRef转换为AXUIElement

这段代码产生了预期的调试输出type = AXUIElement,但是转储了堆栈并说动态转换在转换的实际点失败了:

func mainWindow() {
    var ptr: Unmanaged<AnyObject>?
    let kAXMainWindow: CFString! = "AXMainWindow" as NSString
    let appRef: AXUIElement! = AXUIElementCreateApplication(self.pid()).takeRetainedValue()

    let err = AXUIElementCopyAttributeValue(appRef, kAXMainWindow, &ptr)
    if err == AXError(kAXErrorSuccess) {
        let val: AnyObject? = ptr?.takeRetainedValue()
        if val != nil {
            let value: AnyObject = val!
            let description = CFCopyTypeIDDescription(CFGetTypeID(value))
            println("type = \(description)")
            let element = value as AXUIElement
        }
        else {
            println("got nil result")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

完成这项工作的正确方法是什么?

swift

6
推荐指数
1
解决办法
794
查看次数

标签 统计

cocoa ×1

macos ×1

swift ×1