gpt4 book ai didi

macos - addGlobalMonitorForEventsMatchingMask 不起作用

转载 作者:行者123 更新时间:2023-12-03 16:04:40 24 4
gpt4 key购买 nike

我在获取辅助应用程序(开发案例中的 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;
}

收到的输出是:

2014-08-25 17:26:36.054 test[64725:303] Accessibility Enabled
2014-08-25 17:26:36.055 test[64725:303] registering keydown mask
2014-08-25 17:26:36.067 test[64725:303] entering run loop.

一旦到达这里,就不会发生其他日志记录,无论我按下哪个键或按下哪个应用程序时获得焦点。

FWIW,我正在尝试编写一个辅助应用程序,而不是键盘记录器或其他邪恶的东西。我已经查看了这个问题的其他实例,但它们似乎处理 1)应用程序未启用辅助功能或 2)未接收需要 CGEvents 接收的某些“特殊”命令键。我没有看到任何键,甚至是简单的键(在我输入这篇文章的过程中一直在运行,但没有记录任何内容)。 TIA!

最佳答案

因此,感谢 Ken Thomases 的上述问题,我能够弄清楚如何做到这一点。关键细节是我正在使用命令行应用程序模板(我不需要 UI,所以我试图将事情保持在最低限度)。对我来说这是新闻,但事后看来很明显,仅创建运行循环并不会创建事件循环。为了在命令行应用程序中复制事件循环的创建,必须发挥典型 cocoa 应用程序的更多功能。首先,您必须有一个实现 NSApplicationDelegate 协议(protocol)的类,并且该委托(delegate)将是应用程序代码所在的位置,而 main 方法只需执行以下操作:

#import <Foundation/Foundation.h>
#include "AppDelegate.h"

int main(int argc, const char * argv[])
{
@autoreleasepool {
AppDelegate *delegate = [[AppDelegate alloc] init];

NSApplication * application = [NSApplication sharedApplication];
[application setDelegate:delegate];
[NSApp run];
}
}

这是一个无 Nib 、无菜单栏的应用程序,就像通​​常的命令行应用程序模板一样,但由于 [NSApp run] 调用,它确实具有真正的事件循环。然后,我在上面的 main 方法中使用的应用程序代码移至应用程序委托(delegate)中:

#import "AppDelegate.h"

@implementation AppDelegate

// 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);
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
if (checkAccessibility()) {
NSLog(@"Accessibility Enabled");
}
else {
NSLog(@"Accessibility Disabled");
}

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

}];
}

@end

为了完整性和 future 的读者,头文件如下所示:

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

@interface AppDelegate : NSObject <NSApplicationDelegate>

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification;

@end

关于macos - addGlobalMonitorForEventsMatchingMask 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25496336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com