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