2010-04-10 2 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), что делает это изменение для вас.

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

+0

Большое спасибо за ваш ответ. На самом деле, я не хочу менять имя производителя. Это просто для примера :-) Я хочу изменить значение «trackpadUserPreferences». По-видимому, панель предпочтений Apple Trackpad может это сделать, но я не знаю, как это происходит. Не могли бы вы рассказать мне, как я могу получить объект, который я могу назвать методом setProperty, пожалуйста? Я просмотрел двоичный файл /System/Library/Extensions/AppleUSBMultitouch.kext/Contents/MacOS/AppleUSBMultitouch и нашел строку «AppleUSBMultitouchDriver :: setProperty», но я не знаю, связано ли это с этим каким-либо образом. – yangumi

+0

Я не знаю - я бы запустил Системные настройки в отладчике и попросил его переломить этот вызов, чтобы узнать, как он вызывает функции реестра. – WhirlWind

0

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

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

+0

Большое спасибо за вашу помощь. Я попробовал ваше предложение, но он все еще не работает :-(Я разместил свой фактический код ниже. – yangumi

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); 
Смежные вопросы