Не могу редактировать IORegistryEntry - PullRequest
2 голосов
/ 11 апреля 2010

Я создаю программное обеспечение на 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 ]

1 голос
/ 11 апреля 2010

Чтобы это было возможно, обычно драйвер для конкретного оборудования, которое вы меняете, должен реализовать setProperties () (в IOKit), который делает это изменение для вас.

Маловероятно, что Apple будет реализовывать setProperty () в своем AppleUSBMultitouchDriver таким образом, чтобы можно было изменить имя производителя. Они хотят уточнить, что это за фрукт. ;)

0 голосов
/ 01 июля 2010

Это пример того, как правильно изменить настройки трекпада. 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);
0 голосов
/ 11 апреля 2010

Используйте IOConnectSetCFProperties вместо IORegistryEntrySetCFProperty. Передайте ему словарь с настройками, которые вы хотите установить.

Например, чтобы отключить движение тремя пальцами для навигации, вызовите его со словарем, содержащим {TrackpadThreeFingerSwipe = 0; }

...