objective-c - 如何使用 IOKit 在 macOS 中以编程方式更改鼠标设置
问题描述
自 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;
}
推荐阅读
- azure - 部署到 azure 后出现的旧版 MVC 应用程序
- c++ - 将未定义的引用错误限制为仅直接依赖项
- plsql - 调用一个过程直到孩子存在plsql
- visual-studio - Xamrin.Android 中的产品风格
- vue.js - 如何从 Vue 组件向 Laravel Blade 对象发出值?
- php - Codeigniter retchet websocket 聊天应用程序无法在实时服务器上运行
- apache-kafka-streams - Streams 经常重建商店
- java - 将时间戳解析为 LocalDateTime
- linkedin - LinkedIn Profile API v2:无法检索配置文件列表
- matlab - 获取复数向量在复数矩阵中的位置