2010-04-10 81 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);