如何获取在macos上用C语言接收按键的应用程序的id?

如何获取在macos上用C语言接收按键的应用程序的id?,c,macos,C,Macos,我正在用C为OSX(终端)编写一个程序。正如标题中提到的,只需要接收击键的应用程序的id和/或名称,即聚焦窗口 我发现你可以使用,但我不能在C中使用,或者我不知道如何使用。我不熟悉用macOS编写东西,非常感谢任何帮助。macOS上的UI层都是用Objective-C编写的,直接用C代码很难调用它(从技术上讲,你可以使用objc_msgSend(),但相信我,你不想这么做)。幸运的是,执行此操作所需的Objective-C代码数量非常少,您可以将其分离到一个单独的文件中,该文件包含在您的C代码中

我正在用C为OSX(终端)编写一个程序。正如标题中提到的,只需要接收击键的应用程序的id和/或名称,即聚焦窗口


我发现你可以使用,但我不能在C中使用,或者我不知道如何使用。我不熟悉用macOS编写东西,非常感谢任何帮助。

macOS上的UI层都是用Objective-C编写的,直接用C代码很难调用它(从技术上讲,你可以使用
objc_msgSend()
,但相信我,你不想这么做)。幸运的是,执行此操作所需的Objective-C代码数量非常少,您可以将其分离到一个单独的文件中,该文件包含在您的C代码中:

GetFrontApplication.h:

#ifndef GETFRONTAPPLICATION_H
#define GETFRONTAPPLICATION_H

char *GetFrontmostApplication(void);

#endif /* GETFRONTAPPLICATION_H */
GetFrontApplication.m:

@import Cocoa;

char *GetFrontmostApplication(void) {
    @autoreleasepool {
        NSRunningApplication *frontApp = [[NSWorkspace sharedWorkspace] frontmostApplication];

        return strdup(frontApp.localizedName.UTF8String);
    }
}

现在,您只需
#包含“GetFrontApplication.h”
并从C代码中调用
GetFrontmostApplication()
,就会得到一个包含应用程序名称的
char*
。请确保
free()
处理完字符串。

它应该与简单的#include“GetFrontApplication.h”一起使用,对吗?当我编译它时,我得到一个“未定义的体系结构符号x86_64”,我是否应该在编译指令中添加一些东西,而不是“gcc-o front front.c”?@Daniel至少你需要编译
front.c
GetFrontApplication.m
。您还需要针对Cocoa框架进行链接,但由于我使用了
@import
,只要您在命令行中使用
-fmodules
,就会自动发生这种情况。因此,类似于:
gcc-fmodules-o front.c GetFrontApplication.m
这样的东西应该可以做到这一点。