2010-04-10 136 views
2

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

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价值,但它仍然不会改变。有人有任何建议吗?

谢谢

回答

1

为了使这成为可能,平时您要更改特定的硬件驱动程序必须实现setProperties方法()(中由于IOKit),使这个为你改变。

这是不太可能,苹果将实施的方式,可以让你改变了制造商的名字在他们的AppleUSBMultitouchDriver的setProperty()。他们想要说明他们是什么样的水果。 ;)

+0

非常感谢您的回答。其实,我不想改变制造商的名称。这仅仅是一个例子:-)我想改变“trackpadUserPreferences”的值。显然,苹果的触控板偏好设置面板可以做到这一点,但我不知道它是如何做到的。 你能告诉我如何获得可以调用setProperty方法的对象吗?我查看了/System/Library/Extensions/AppleUSBMultitouch.kext/Contents/MacOS/AppleUSBMultitouch的二进制文件,发现了一个字符串“AppleUSBMultitouchDriver :: setProperty”,但我不知道这是否与此有任何关系。 – yangumi 2010-04-10 23:27:43

+0

我不知道 - 我会在调试器中运行系统偏好设置,让它在该调用中断,看看它是如何调用到注册表函数中的。 – WhirlWind 2010-04-10 23:36:26

0

使用IOConnectSetCFProperties而不是IORegistryEntrySetCFProperty。传递一个你想要设置的设置的字典。

例如关闭三个手指滑动来导航,用含有字典{TrackpadThreeFingerSwipe = 0调用它; }

+0

非常感谢您的帮助。我尝试了你的建议,但它仍然无效:-(我已经在下面发布了我的实际代码。 – yangumi 2010-04-11 19:05:08

0

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

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

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);