Objective-C中如何让NSOpenPanel正确响应键盘与鼠标事件
问题根因
你遇到的事件响应异常是因为 macOS 控制台程序默认没有初始化 Cocoa 应用的活动上下文,进程没有被识别为前台活跃应用,因此弹出的 NSOpenPanel 无法获得输入焦点。
修复后代码
const char* openDialog() { // 新增两行初始化Cocoa应用上下文并申请前台激活权限 [[NSApplication sharedApplication] setActivationPolicy:NSApplicationActivationPolicyRegular]; [[NSApplication sharedApplication] activateIgnoringOtherApps:YES]; NSOpenPanel* openDlg = [NSOpenPanel openPanel]; [openDlg setCanChooseFiles:YES]; [openDlg setFloatingPanel:YES]; if ( [openDlg runModal] == NSOKButton ) { for( NSURL* URL in [openDlg URLs] ) { NSLog( @"%@", [URL path] ); return [URL.path UTF8String]; } } // 若后续不需要再弹出GUI界面,可选择重置激活策略 // [[NSApplication sharedApplication] setActivationPolicy:NSApplicationActivationPolicyProhibited]; return NULL; }
补充配置说明
- 包含该函数的源码文件后缀需要改为
.mm启用 Objective-C++ 混编 - 编译时需要链接 Cocoa 框架:Xcode 中可在项目配置的
Build Phases -> Link Binary With Libraries中添加Cocoa.framework - 如果从终端运行仍有焦点异常,可以在 main 函数最开头先调用一次
[NSApplication sharedApplication]提前完成 Cocoa 上下文初始化
内容的提问来源于stack exchange,提问作者Á. Márton
相关产品推荐
相关产品推荐

