2

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

谢谢

4

3 回答 3

1

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

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

于 2010-04-10T21:39:15.233 回答
0

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

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

于 2010-04-11T14:01:26.637 回答
0

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

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

PPS 仅在 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);
于 2010-07-01T17:55:27.770 回答