我有这个应用程序,我需要从我的应用程序中激活其他应用程序的菜单项(如打印cmd + p).现在我正在使用CGEventPostToPSN()来完成这项工作并且工作正常,但是当我激活沙盒时,它会停止工作.
CGEventPostToPSN(&psn, keyDownEvent);
CFRelease(keyDownEvent);
CGEventPostToPSN(&psn, keyUpEvent);
CFRelease(keyUpEvent);
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,当我需要启用沙盒时,我该怎么办?我听说过很多关于Accessibility API的内容,但我无法了解如何激活其他应用程序的菜单项.我很感谢你对这个问题的任何答案.
法比安
我需要将密钥组合^⌘C发送到带有包标识符的后台应用程序com.company.app
.然后,键组合应激活该应用程序中的菜单项.
不幸的是,我不知道如何做到这一点.一些研究指出我使用NSEvent和CGEvent API CGEventPostToPSN()
,但我无法正常工作,因为我不知道如何设置密钥组合.CGEventPost()
似乎不适用于我创建的事件,即使所需的应用程序是活动的.
这是我最终提出的代码,但这不起作用:
CGWindowID windowNumber;
NSEvent *event = [NSEvent keyEventWithType:NSKeyUp
location:NSZeroPoint
modifierFlags:(NSControlKeyMask | NSCommandKeyMask)
timestamp:[[NSProcessInfo processInfo] systemUptime]
windowNumber:windowNumber
context:[NSGraphicsContext currentContext]
characters:@"c"
charactersIgnoringModifiers:@"c"
isARepeat:NO
keyCode:8];
CGEventRef eventRef = [event CGEvent];
Run Code Online (Sandbox Code Playgroud)
我现在该怎么办?为什么没有NSEvent
相应的CGEventPost()
?是否有更简单的方法来激活该菜单项而不是发布活动?我可以很容易地得到一个实例NSRunningApplication
,但是没有合适的API来完成我的任务.
更新: 我搞定了:
- (void) postFakedKeyboardEventForCopyScreenToPasteboardToPSN:(ProcessSerialNumber)psn {
CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStatePrivate);
CGEventRef keyDownEvent = CGEventCreateKeyboardEvent(source, (CGKeyCode)8, true);
CGEventSetFlags(keyDownEvent, (kCGEventFlagMaskControl | kCGEventFlagMaskCommand));
CGEventRef keyUpEvent = CGEventCreateKeyboardEvent(source, (CGKeyCode)8, false);
CGEventSetFlags(keyUpEvent, (kCGEventFlagMaskControl | kCGEventFlagMaskCommand));
CFRelease(source);
CGEventPostToPSN(&psn, keyDownEvent);
CFRelease(keyDownEvent);
CGEventPostToPSN(&psn, keyUpEvent);
CFRelease(keyUpEvent); …
Run Code Online (Sandbox Code Playgroud) 我正在努力在我的游戏中集成基于回合的比赛,几天前我开始从 GameKit API 收到奇怪的错误,说本地玩家没有经过身份验证,即使他是。
当我启动应用程序时,将authenticateHandler
调用 ,显示视图控制器,输入密码后,authenticaHandler
再次调用 并且本地播放器似乎已通过身份验证。isAuthenticated
返回YES
。
但是一旦我开始使用任何 GameKit API,比如loadFriendsWithCompletionHandler:
,就会返回一个错误,指出玩家尚未通过身份验证。
这是用于处理身份验证更改的代码。
[[GKLocalPlayer localPlayer] setAuthenticateHandler:^(UIViewController *viewController, NSError *error) {
if ([[GKLocalPlayer localPlayer] isAuthenticated]) {
// Player authenticated
} else {
// Player not authenticated
if (viewController != nil) {
// Present view controller
}
}
}];
Run Code Online (Sandbox Code Playgroud)
这是我在调用任何 GameKit 方法时收到的错误消息。请注意,-isAuthenticated
返回错误时仍然返回YES。
查找匹配时出错:Error Domain=GKErrorDomain Code=6 “请求的操作无法完成,因为本地播放器尚未通过身份验证。” UserInfo=0x14e9f950 {NSLocalizedDescription=请求的操作无法完成,因为本地播放器尚未通过身份验证。}
(lldb) print (BOOL) [[GKLocalPlayer localPlayer] isAuthenticated] (BOOL) $3 = YES
我正在 Game Center 沙箱中进行测试,几天前它开始发生。以前,我根本没有遇到这个问题。 …
spring-boot使用的CRaSH项目可以为Spring提供交互式shell.
我发现spring-shell也有类似的功能.
那么他们之间有什么区别?为什么不使用spring-sehll进行弹簧启动?
任何意见或反馈将不胜感激.
cocoa ×2
macos ×2
objective-c ×2
background ×1
game-center ×1
gamekit ×1
ios ×1
java ×1
keycode ×1
nsevent ×1
sandbox ×1
spring ×1
spring-shell ×1