- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在获取辅助应用程序(开发案例中的 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/
我在获取辅助应用程序(开发案例中的 XCode)来捕获全局 keyDown 事件时遇到问题。我见过很多类似下面的代码示例,但这对我来说在 10.9.4 上不起作用。 #import #import
我正在使用此代码在我的应用中捕获全局键盘快捷键。 这几乎适用于我运行它的每台计算机。这周我在一台全新的 Retina Macbook Pro 上试用了它,addGlobalMonitorForEven
我正在尝试学习为 Mac 编写代码。我使用 Java 已有一段时间了,所以我希望我遇到的问题是对 Cocoa 的简单误解。 我有以下代码: -(IBAction)beginEventMonitor:(
我有简单的鼠标点击全局监视器: [NSEvent addGlobalMonitorForEventsMatchingMask:NSLeftMouseDownMask handler:^(NSEvent
我是 Obj-C 和 Cocoa 的新手。我正在尝试开发一个非常简单的命令行应用程序,该应用程序在启动时等待一些全局鼠标事件,并在完成后退出。我已经正确地实现了一个 NSRunLoop 以避免 cli
我是一名优秀的程序员,十分优秀!