目标C运行时访问屏幕尺寸
Objective C Runtime to access screen dimensions
我正在做一个不需要使用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(祝你好运!)。
我认为对你有帮助的命令是:
CGGetActiveDisplayList
和CGDisplayScreenSize
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 我的简单if-else语句是如何无法访问的代码
- 从C++dll访问C#中的一行主要参数
- 概念TS检查忽略私有访问修饰符
- 访问被拒绝后,c++中的故障保护代码
- 在c++中访问int到类对象的映射时出错
- 我想访问std::unique_ptr中的一个特定元素
- 目标C运行时访问屏幕尺寸
- 为什么我的c++ cmd屏幕挂起时,我试图访问一个文件来存储数据
- 在用户关闭bb10(z10)应用程序时,访问主屏幕上的应用程序图标需要很长时间
- 我需要访问一个随机的.txt文件,或一个.txt文件的随机行,并把它输出到屏幕上