objective-c - 如何使用 IOKit 在 macOS 中以编程方式更改鼠标设置

标签 objective-c macos kernel mouse iokit

自 macOS 10.12 以来,函数 IOHIDGetAccelerationWithKeyIOHIDSetAccelerationWithKey 已被弃用,因此我尝试使用其他 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/

相关文章:

ios - 在 Swift 和 Objective-C 之间共享变量?

c++ - 如何在 OS X 10.6 上针对 OS X 10.4u SDK 构建 boost 库和其他库?

java - windows中的bat文件转换为osx中的自动化脚本

linux - linux 内核驱动程序,取消引用指针和 printk

c - 关于结构的基本问题

ruby - 重写 Ruby 中的内核方法

ios - 如何在 Objective c 的 Core Data 中添加数组作为字符串

objective-c - 处理平面图像与交错图像的运行速度

ios - 应用程序首次启动时需要多长时间才能收到 APNS Push_token?

objective-c - 在结束编辑时执行操作