自 macOS 10.12 以来,函数 IOHIDGetAccelerationWithKey
和 IOHIDSetAccelerationWithKey
已被弃用,因此我尝试使用其他 IO*
方法实现相同的功能。
我从未使用过 IOKit,因此,我所能做的就是在谷歌上搜索函数并尝试让它工作。
现在我发现了这个:Can't edit IORegistryEntry其中有一个如何更改 TrackpadThreeFingerSwipe
属性的示例,但是它使用的函数不是为我定义的:getEVSHandle
。谷歌搜索只显示它应该在 MachineSettings 框架中找到,但是我似乎无法在 Xcode 11 中添加任何“MachineSettings”框架。
我该怎么办?当前代码如下:
#import <Foundation/Foundation.h>
#import <IOKit/hidsystem/IOHIDLib.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSInteger value = -65536;
CFNumberRef number = CFNumberCreate(kCFAllocatorDefault, kCFNumberNSIntegerType, &value);
CFMutableDictionaryRef propertyDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, NULL, NULL);
CFDictionarySetValue(propertyDict, @"HIDMouseAcceleration", number);
io_connect_t connect = getEVSHandle(); // ???
if (!connect)
{
NSLog(@"Unable to get EVS handle");
}
res = IOConnectSetCFProperties(connect, propertyDict);
if (res != KERN_SUCCESS)
{
NSLog(@"Failed to set mouse acceleration (%d)", res);
}
IOObjectRelease(service);
CFRelease(propertyDict);
}
return 0;
}
最佳答案
以下作品(使用 Xcode 11.2/macOS 10.15 测试)
#import <Foundation/Foundation.h>
#import <IOKit/hidsystem/IOHIDLib.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
io_service_t service = IORegistryEntryFromPath(kIOMasterPortDefault,
kIOServicePlane ":/IOResources/IOHIDSystem");
NSDictionary *parameters = (__bridge NSDictionary *)IORegistryEntryCreateCFProperty(service,
CFSTR(kIOHIDParametersKey), kCFAllocatorDefault, kNilOptions);
NSLog(@"%@", parameters);
NSMutableDictionary *newParameters = [parameters mutableCopy];
newParameters[@"HIDMouseAcceleration"] = @(12345);
kern_return_t result = IORegistryEntrySetCFProperty(service,
CFSTR(kIOHIDParametersKey), (__bridge CFDictionaryRef)newParameters);
NSLog(kIOReturnSuccess == result ? @"Updated" : @"Failed");
IOObjectRelease(service);
}
return 0;
}
关于objective-c - 如何使用 IOKit 在 macOS 中以编程方式更改鼠标设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58322674/