【问题标题】:Can't edit IORegistryEntry无法编辑 IORegistryEntry
【发布时间】:2010-04-10 21:24:17
【问题描述】:

我正在 Mac 上创建软件,我想更改 IORegistryEntry 的值。我可以在 IORegistryExplorer 上查看它,但我无法编辑它。所以我的理解是我必须通过代码来编辑它。这是我的代码:

CFMutableDictionaryRef matchingDict = IOServiceNameMatching("AppleUSBMultitouchDriver");
io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, matchingDict);
if(service) {
 CFStringRef manufacturer = IORegistryEntryCreateCFProperty(service, CFSTR("Manufacturer"), kCFAllocatorDefault,0);
 NSLog(@"%@", (NSString*)manufacturer);
 kern_return_t err = IORegistryEntrySetCFProperty(service, CFSTR("Manufacturer"), CFSTR("test"));
 NSLog(@"error = %d", err);
}

这将输出

2010-04-10 16:09:09.015 Test[41548:a0f] Apple Inc.
2010-04-10 16:09:09.015 Test[41548:a0f] error = 0

但是在我检查了 IORegistryExplorer 中的值之后,它仍然没有改变。有人有什么建议吗?

谢谢

【问题讨论】:

    标签: macos cocoa iokit


    【解决方案1】:

    为了实现这一点,通常您要更改的特定硬件的驱动程序必须实现 setProperties()(在 IOKit 中),以便为您进行更改。

    Apple 不太可能以允许您更改制造商名称的方式在其 AppleUSBMultitouchDriver 中实现 setProperty()。他们想指定他们是哪种水果。 ;)

    【讨论】:

    • 非常感谢您的回答。实际上,我不想更改制造商名称。这只是示例:-) 我想更改“trackpadUserPreferences”的值。显然,Apple 的 Trackpad 首选项窗格可以做到这一点,但我不知道它是如何做到的。请告诉我如何获取可以调用 setProperty 方法的对象?我查看了 /System/Library/Extensions/AppleUSBMultitouch.kext/Contents/MacOS/AppleUSBMultitouch 的二进制文件,发现了一个字符串“AppleUSBMultitouchDriver::setProperty”,但我不知道这是否与此有关。跨度>
    • 我不知道——我会在调试器中运行系统偏好设置并让它在该调用中中断以查看它是如何调用注册表函数的。
    【解决方案2】:

    使用 IOConnectSetCFProperties 而不是 IORegistryEntrySetCFProperty。将包含您要设置的设置的字典传递给它。

    例如要关闭三指滑动导航,请使用包含 { TrackpadThreeFingerSwipe = 0; 的字典调用它}

    【讨论】:

    • 非常感谢您的帮助。我尝试了你的建议,但它仍然不起作用:-(我在下面发布了我的实际代码。
    【解决方案3】:

    这是如何正确更改触控板设置的示例。 Trackpad.prefpane 正是这样做的,但也会将此设置保存在默认值的某个位置(如果您找不到确切的位置,请在此处询问)。

    附: getEVSHandle() 可以在 MachineSettings.framework 中找到。

    附言仅在 10.5 和 10.6 上检查。

    NSInteger zero = 0, one = 1;
    
    CFNumberRef _numberWith0 = CFNumberCreate(kCFAllocatorDefault, kCFNumberNSIntegerType, &zero);
    CFNumberRef _numberWith1 = CFNumberCreate(kCFAllocatorDefault, kCFNumberNSIntegerType, &one);
    
    CFMutableDictionaryRef propertyDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, NULL, NULL);
    
    CFDictionarySetValue(propertyDict, @"TrackpadThreeFingerSwipe", flag ? _numberWith1 : _numberWith0);
    
    io_connect_t connect = getEVSHandle();
    
    if (!connect)
    {
    // error
    }
    
    kern_return_t status = IOConnectSetCFProperties(connect, propertyDict);
    
    if (status != KERN_SUCCESS)
    {
    //error
    }
    
    CFRelease(propertyDict);
    

    【讨论】:

    • 我通过谷歌找到了这个,我正在尝试做类似的事情。但是 getEVSHandle 没有为我定义。我如何在一个简单的 C 程序中得到它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    相关资源
    最近更新 更多