从 xcode 创建一个“命令行工具”项目,然后设置并运行 NSApplication。此应用程序中的光标无法更改

Posted

技术标签:

【中文标题】从 xcode 创建一个“命令行工具”项目,然后设置并运行 NSApplication。此应用程序中的光标无法更改【英文标题】:Create a "Command Line Tool" project from xcode, and setup and run NSApplication. The cursor in this application can't change 【发布时间】:2020-03-18 03:52:27 【问题描述】:

我制作了一个基于“命令行工具”项目的小工具。 除此工具中的光标外,一切正常。

这是启动代码:

int main(int argc, const char * argv[]) 
    NSApplication * app = [NSApplication sharedApplication];
    MyDelegate * delegate = [[MyDelegate alloc] init];
    app.delegate = delegate;
    [app run];
    return 0;

在 MyDelegate 中,我创建了窗口、视图等。但是我覆盖了视图中的 resetCursorRects 函数,但什么也没发生。

如果在应用程序项目中运行相同的代码,一切都会好起来的。

我尝试过的所有内容包括:

    从 NSApplication 创建一个子类并重写 run 函数来处理 uesr 事件。 在视图中创建一个 NSTrackingArea 来更新光标。 在 mainThread 上执行 selector(run) 并等待直到完成。

但是它们根本不起作用。

现在我猜的所有原因是函数NSApplicationMain(argc, argv) 不等于[app run]

有什么区别?谁能帮帮我?

PS:如果我使用NSApplicationMain(argc, argv),xcode 会给我一个错误,我必须有一个 bundle 和 Info.plist。我不想创建应用程序,因为它太胖了。

【问题讨论】:

【参考方案1】:

默认情况下,不是捆绑应用程序的程序是仅后台进程。默认情况下,捆绑的应用程序是具有前台功能的进程。 (可以在应用的 Info.plist 中设置 LSUIElement 键来更改它。)

只有激活的应用可以设置光标。仅后台或 UI 元素(也称为附件)进程不能成为活动应用。

如果您希望您的程序能够被激活并控制光标,您可以使用[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular] 使其成为具有前台功能的应用程序进程。请注意,这将使它出现在 Dock 和 Command-Tab 应用程序切换器中(但带有通用可执行图标)。

当然,让您的程序成为一个成熟的捆绑应用程序更加容易和简单。

【讨论】:

哇,太棒了。而我真正需要的策略是 NSApplicationActivationPolicyAccessory。非常感谢:D。

以上是关于从 xcode 创建一个“命令行工具”项目,然后设置并运行 NSApplication。此应用程序中的光标无法更改的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 命令行工具 (XCode 4.6) 从终端运行单元测试

Xcode GM:OS X 命令行工具项目没有 swift 语言?

使用命令行工具从 Xcode 复制文件

如何在 Xcode 4.5“命令行工具”项目中设置工作逻辑单元测试目标?

从命令行守护程​​序使用 MLMediaLibrary 时出现 XPC 错误

如何使用 Xcode 5 从命令行运行 xctest?