如何在 C++ 中访问 Apple Events“openFile”事件?

Ste*_*own 5 c c++ macos xcode cocoa

我有兴趣用 C++ 为 Mac OS X 编写一个小实用程序来读取、解析、保存(覆盖)写入文件。我不需要任何 GUI、菜单或窗口。

  1. 在 XCode 中我需要从什么类型的项目模板开始?
  2. 如何访问传入的文件?(Apple Events 已经通过了openFile,对吧?)

我在 C++ 上做过一些工作,但在 Mac 上却没有做过任何事情。感谢链接,更感谢代码示例。

Dar*_*ren 1

您打算如何将文件传递到您的应用程序?

如果是通过命令行,那么您将使用命令行工具模板并访问命令行参数,就像在任何 POSIX 平台(argcargv)上一样。

如果您想使用 Finder 将文件传递到应用程序,例如将文件拖放到应用程序图标上,那么您可以使用 Cocoa 应用程序模板。

Info.plist 文件包含您的应用程序配置和支持的文档类型,类似于 Windows 上的注册表。

  1. 您可以通过项目设置的“信息”选项卡配置 Info.plist(它是 XCode 中文件导航器中最顶层的文件)。单击右下角的“添加”按钮,然后选择“添加文档类型”以添加您的应用程序将接受的文档类型。要接受所有文档,请将文档名称设置为All并将扩展名设置为*更多信息请参见此处

  2. LSUIElement在 Info.plist 中添加一个键,并将其值设置为YES来指示您的应用程序没有 UI。该键在 XCode 中也显示为“Application is agent”。 有关 LSUIElement 的更多信息请参见此处。

  3. 在 MainMenu.xib 中,您可以删除默认情况下存在的窗口和字体管理器对象,因为您不需要它们。

  4. 将 AppDelegate.m 文件重命名为AppDelegate.mm,以便将其编译为 Objective-C++。这将允许您在该文件中使用 C++ 代码。

  5. applicationDidFinishLaunching:委托方法中进行添加,[NSApp terminate:nil];以便您的应用程序在完成工作后立即退出。

将以下方法添加到 AppDelegate.mm 中:

- (BOOL)application:(NSApplication*)app openFile:(NSString *)filename
{
    NSLog(@"Opening file %@", filename);

    char* cFilename = [filename UTF8String];    

    // Your C++ code goes here

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

就是这样。剩下的就是你的 C++ 代码。您可以将任何您想要的 C++ 代码添加到 AppDelegate.mm 中。例如:

#include <string>
#include <iostream>
#include "MyCppFileProcessor.h"

- (BOOL)application:(NSApplication*)app openFile:(NSString *)filename
{
    std::string cFilename([filename UTF8String]);
    std::cout << "Processing file: " << cFilename << std::endl;

    MyCppFileProcessor fileProcessor;
    fileProcessor.processFile(cFilename);

    return YES;
}
Run Code Online (Sandbox Code Playgroud)

每当您将文档拖放到 Finder 中的应用程序图标上时,都会运行此代码。