从CLI应用调用NSOpenPanel后,如何自动激活终端窗口?
解决CLI调用AppKit文件选择器后自动激活终端的问题
你遇到的问题是因为AppKit文件选择器关闭后,CLI应用的附属激活策略不会自动把焦点交还给终端。可以通过在对话框关闭后主动激活终端(或原前台应用)来解决。
方法一:通用恢复原前台应用
这种方法适用于所有终端模拟器(比如Terminal、iTerm2),先记录打开对话框前的活跃应用,关闭后恢复焦点:
void request_file(void) { NSOpenPanel* openPanel = [NSOpenPanel openPanel]; openPanel.canChooseFiles = YES; // 记录当前前台应用 NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; NSRunningApplication *previousActiveApp = workspace.frontmostApplication; [NSApp activateIgnoringOtherApps:YES]; NSInteger result = [openPanel runModal]; if (result == NSModalResponseOK) { // 处理选中的URL } // 恢复之前的前台应用 if (previousActiveApp) { [previousActiveApp activateWithOptions:NSApplicationActivateIgnoringOtherApps]; } }
方法二:直接激活Terminal.app
如果确定用户只用系统自带终端,可以直接定位并激活它:
void request_file(void) { NSOpenPanel* openPanel = [NSOpenPanel openPanel]; openPanel.canChooseFiles = YES; [NSApp activateIgnoringOtherApps:YES]; NSInteger result = [openPanel runModal]; if (result == NSModalResponseOK) { // 处理选中的URL } // 找到并激活终端应用 NSWorkspace *workspace = [NSWorkspace sharedWorkspace]; NSArray *terminalApps = [workspace runningApplicationsWithBundleIdentifier:@"com.apple.Terminal"]; if (terminalApps.count > 0) { NSRunningApplication *terminal = terminalApps.firstObject; [terminal activateWithOptions:NSApplicationActivateIgnoringOtherApps]; } }
额外优化:简化模态调用逻辑
你原代码同时使用了beginWithCompletionHandler:和runModal,属于冗余的模态调用方式,上面的示例已经简化为只用runModal,逻辑更清晰且效果一致。
内容的提问来源于stack exchange,提问作者Oldes
相关产品推荐
相关产品推荐

