无法编辑IORegistryEntry

时间:2010-04-10 21:24:17

标签: macos cocoa iokit

我正在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中的值之后,它仍然没有改变。有人有什么建议吗?

谢谢

3 个答案:

答案 0 :(得分:1)

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

Apple不太可能以允许您更改制造商名称的方式在AppleUSBMultitouchDriver中实现setProperty()。他们想要说明它们是什么样的水果。 ;)

答案 1 :(得分:0)

使用IOConnectSetCFProperties而不是IORegistryEntrySetCFProperty。将它传递给你想要设置的字典。

例如,要关闭三个手指滑动以进行导航,请使用包含{TrackpadThreeFingerSwipe = 0; }

答案 2 :(得分:0)

这是如何正确更改触控板设置的示例。 Trackpad.prefpane正是这样做的,但也将这个设置保存在默认值的某个地方(如果你不知道究竟在哪里,请在这里询问一下)。

P.S。 getEVSHandle()可以在MachineSettings.framework中找到。

P.P.S。只检查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);