目标C运行时访问屏幕尺寸

Objective C Runtime to access screen dimensions

本文关键字:屏幕 访问 运行时 目标      更新时间:2023-10-16

我正在做一个不需要使用Cocoa和Objective C的项目。

前几天,我偶然发现了Objective C运行库,并一直试图使用它来访问屏幕的尺寸。

这是我目前拥有的代码:

auto screen = objc_msgSend(objc_lookUpClass("NSScreen"),sel_getUid("mainScreen")); //Returns an NSScreen*
auto frame = objc_msgSend(screen, sel_getUid("frame")); // should return an NSRect but I get an EXC_BAD_ACCESS and the program quits

使用Cocoa不是一种选择,Carbon也不再受支持。我希望有人熟悉ObjcRuntime并能够解决这个问题。

auto screen = objc_msgSend(objc_lookUpClass("NSScreen"),sel_getUid("mainScreen")); //Returns an NSScreen*
auto frame = objc_msgSend(screen, sel_getUid("frame")); // BAD_ACCESS

崩溃的具体原因是您需要使用objc_msgSend()的一个变体。特别是,可以返回不适合堆栈的大型结构的类型。

使用Cocoa不是的选项

通过objc_msgSend()使用Cocoa仍然在使用Cocoa!

上面的代码对于任何其他平台来说都不比简单地将所有内容写成Objective-C更容易移植。您仍然不能在Linux或Windows上使用NSScreen,因此,在任何一个平台上编译上述代码行都没有意义。

您最好采用与其他跨平台库相同的方法。

•创建一个API,作为通用的跨平台UI API

•在API下,在可移植代码中尽可能多地实现

•创建一个低级别桥接API,在您的可移植代码和系统之间提供接口

•对于每个平台,实现特定于所需平台技术的桥接API

这将允许您在OSX上直接使用Objective-C,同时仍然在顶部维护跨平台API。

如果你真的想在获取这些信息时避免Objective-C,你需要深入研究低级别的Quartz(祝你好运!)。

我认为对你有帮助的命令是:

CGGetActiveDisplayListCGDisplayScreenSize