2010-04-10 3 views
2

Je crée un logiciel sur Mac et je voudrais changer la valeur d'un IORegistryEntry. Je peux le voir sur IORegistryExplorer, mais je ne peux pas le modifier. Donc, je crois comprendre que je dois l'éditer par code. Voici mon code:Impossible d'éditer 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); 
} 

Affichera

2010-04-10 16:09:09.015 Test[41548:a0f] Apple Inc. 
2010-04-10 16:09:09.015 Test[41548:a0f] error = 0 

Mais après que je vérifie la valeur du IORegistryExplorer, elle ne change toujours pas. Quelqu'un a-t'il des suggestions?

Merci

Répondre

1

Pour que cela soit possible, généralement le pilote pour le matériel particulier que vous modifiez doit mettre en œuvre setProperties() (en IOKit) qui fait ce changement pour vous.

Il est peu probable qu'Apple implémente setProperty() dans leur AppleUSBMultitouchDriver d'une manière qui vous permette de changer le nom du fabricant. Ils veulent préciser quel type de fruit ils sont. ;)

+0

Merci beaucoup pour votre réponse. En fait, je ne veux pas changer le nom du fabricant. C'est juste pour l'exemple :-) Je veux changer la valeur de "trackpadUserPreferences". Apparemment, le volet de préférence Trackpad d'Apple peut le faire, mais je ne sais pas comment cela fonctionne. Pourriez-vous me dire comment obtenir l'objet que je peux appeler la méthode setProperty, s'il vous plaît? J'ai regardé le binaire de /System/Library/Extensions/AppleUSBMultitouch.kext/Contents/MacOS/AppleUSBMultitouch et trouvé une chaîne "AppleUSBMultitouchDriver :: setProperty" mais je ne sais pas si cela est lié à cela de quelque façon que ce soit. – yangumi

+0

Je ne sais pas - j'exécuterais les Préférences Système dans un débogueur et je ferais en sorte qu'il casse cet appel pour voir comment il appelle les fonctions du registre. – WhirlWind

0

Utilisez IOConnectSetCFProperties au lieu de IORegistryEntrySetCFProperty. Passez-lui un dictionnaire avec les paramètres que vous souhaitez définir. Par exemple, pour désactiver la navigation à trois doigts, appelez-le avec un dictionnaire contenant {TrackpadThreeFingerSwipe = 0; }

+0

Merci beaucoup pour votre aide. J'ai essayé votre suggestion, mais cela ne fonctionne toujours pas :-(J'ai posté mon code actuel ci-dessous. – yangumi

0

Ceci est un exemple de la façon de modifier correctement les paramètres du trackpad. Trackpad.prefpane faire exactement cela, mais aussi enregistrer ce paramètre quelque part dans les valeurs par défaut (si vous ne trouverez pas exactement où, demandez ici à ce sujet).

P.S. getEVSHandle() peut être trouvé dans MachineSettings.framework.

P.P.S. Vérifié uniquement sur 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);