【问题标题】:What is the Cocoa equivalent of UpdateSystemActivity?UpdateSystemActivity 的 Cocoa 等价物是什么?
【发布时间】:2010-11-22 10:15:59
【问题描述】:

我正在将 Carbon 应用程序转换为 Cocoa 应用程序,但找不到对应的 Cocoa 应用程序:

UpdateSystemActivity(UsrActivity);

那里有任何 Mac 人愿意为我指明正确的方向吗?谢谢。

更新:我正在构建 64 位。构建 32 位工作正常,但是当我为 64 位构建时,我得到了 UpdateSystemActivity(和其他)的符号未在此范围内声明的错误。

UPDATE2:我正在导入以下内容:

#import <Cocoa/Cocoa.h>
#import <Carbon/Carbon.h>
#import <OpenGL/CGLMacro.h>

在构建 64 位时我还需要导入其他东西吗?

UPDATE3:添加 #import &lt;CoreServices/CoreServices.h&gt; 没有帮助。我仍然收到编译器错误,告诉我 UpdateSystemActivity 和 UsrActivity 未在此范围内声明。

UPDATE4:好的,在 OSServices/Power.h 上找不到文件。我正在构建针对 10.5 SDK 和快速搜索显示:

$ pwd
/Developer/SDKs
$ find . -name Power.h
./MacOSX10.3.9.sdk/Developer/Headers/CFMCarbon/OSServices/Power.h
./MacOSX10.3.9.sdk/Developer/Headers/CFMCarbon/Power.h
./MacOSX10.3.9.sdk/Developer/Headers/FlatCarbon/Power.h
./MacOSX10.3.9.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/Power.h

./MacOSX10.4u.sdk/Developer/Headers/CFMCarbon/OSServices/Power.h
./MacOSX10.4u.sdk/Developer/Headers/CFMCarbon/Power.h
./MacOSX10.4u.sdk/Developer/Headers/FlatCarbon/Power.h
./MacOSX10.4u.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/Power.h

./MacOSX10.5.sdk/Developer/Headers/FlatCarbon/Power.h
./MacOSX10.5.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/Power.h

但我明白了:

Mac.mm:6:29: error: OSServices/Power.h: No such file or directory
Mac.mm:6:29: error: OSServices/Power.h: No such file or directory

【问题讨论】:

  • 基于这一行:./MacOSX10.5.sdk/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/OSServices.framework/Versions/A/Headers/Power.h您需要将 OSServices 框架包含到您的项目中——是否存在?
  • 我还没有机会回到这个话题。 Snow Leopard 彻底破坏了我们的应用程序,我一直在努力让它工作。不过,我很快就会回到这一点。感谢您一直以来的帮助。
  • 好吧,我们搁置了 64 位版本,所以我没有更进一步。但我认为 fbereto 是在正确的轨道上。
  • 如果您的目标是防止屏幕变暗,请参阅stackoverflow.com/questions/5596319/…

标签: cocoa macos power-management


【解决方案1】:

在 OS X 10.6 及更高版本中,IOKit 可用于禁用睡眠。当你想禁用睡眠时创建一个 IOPMAssertion,当你想再次允许睡眠时销毁它。

#import <IOKit/pwr_mgt/IOPMLib.h>

// kIOPMAssertionTypeNoDisplaySleep prevents display sleep,
// kIOPMAssertionTypeNoIdleSleep prevents idle sleep
// reasonForActivity is a descriptive string why sleep is disabled

CFStringRef* reasonForActivity= CFSTR("Describe Activity Type");

IOPMAssertionID assertionID;
IOReturn success = IOPMAssertionCreateWithName(kIOPMAssertionTypeNoDisplaySleep, kIOPMAssertionLevelOn, reasonForActivity, &assertionID);

if (success == kIOReturnSuccess)
{ 
    //Add the work you need to do without the system sleeping here.

    success = IOPMAssertionRelease(assertionID);
    //The system will be able to sleep again.
}

更多信息:https://developer.apple.com/library/mac/qa/qa1340/_index.html

【讨论】:

    【解决方案2】:

    如果定义了 __LP64__,则此处的问题似乎是 OSServices.h 中排除 Power.h 的行。在 10.5 上构建 64 位时,UpdateSystemActivity 确实是未定义的。

    好消息是该符号确实存在于 CoreServices.framework 中。有两种方法可以访问它。

    1. 转发声明:extern "C" OSErr UpdateSystemActivity(UInt8);
    2. 明确包含您尝试过的 Power.h。您尝试的问题是 OSServices/ 没有找到它进入搜索路径的方式。您可以像这样包含它:#import /SDKs/MacOSX10.5.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/OSServices.framework/Headers/Power.h>

    我手边没有 SnowLeopard 的副本,但接下来要做的是检查它是否已修复。如果不是,请提交 RADAR,因为这显然是 SDK 错误。

    【讨论】:

    • Power.h 标头中的 UpdateSystemActivity() 确实为 10.6 SDK 中的 64 位应用程序回归。因此,该遗漏似乎是无意的,并且仍支持 UpdateSystemActivity() 用于防止空闲睡眠,如developer.apple.com/mac/library/qa/qa2004/qa1160.html 中所述。只需使用 Xcode 的“快速打开”进入 Power.h,并将函数声明和活动类型枚举复制到您自己的解决方法头中。
    • natevw:即使这样也不再需要了。只需#include &lt;CoreServices/CoreServices.h&gt; 即可,因为 Power.h 的 #include 不再被 #if !__LP64__ 行覆盖。
    【解决方案3】:

    你应该仍然可以在你的 Cocoa 应用中调用UpdateSystemActivity——它没有被标记为弃用。

    API 的文档指定导入 CoreServices/CoreServices.h 以获取 API ——但是通过标头搜索(特别是在 OSServices/OSServices.h 中)显示该文件在 64 位环境中被省略。尽管如此,Power.h 的某些部分(其中定义了 UpdateSystemActivity)对于 64 位是关闭的,UpdateSystemActivity 不是其中之一。

    鉴于此,尝试直接#import &lt;OSServices/Power.h&gt; 看看是否有效。 (您必须在项目中包含 CoreServices 框架才能找到标头。)

    【讨论】:

    • 我相信 Carbon 本身已被 64 位弃用。我正在构建一个 64 位应用程序。
    • 你被引导到半错误地相信。 64 位中不存在 Carbon 的位,尤其是 HIServices。其他位已被重新定义为非 Carbon(例如文件管理器,尽管位于 CarbonCore.framework 中,但现在被认为是与 Carbon 无关的“核心组件”)。如果您可以在 64 位中使用 UpdateSystemActivity() 编译和链接代码,则不受影响。
    • 啊,但我无法编译链接。 32 位编译,但 64 位说“我不知道这个符号 UpdateSystemActivity;所以,带我去吧。”我所包含的内容没有任何改变。
    • 您希望它在什么框架中?文档说它应该是 CoreServices 的一部分。
    • 是的,您仍然可以致电UpdateSystemActivity,但在 64 位应用程序中似乎没有达到预期的效果(屏幕仍然变暗或屏幕保护程序已激活)。
    猜你喜欢
    • 2014-06-18
    • 2010-10-24
    • 1970-01-01
    • 2014-05-08
    • 2014-06-12
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多