【问题标题】:How to change mouse settings programmatically in macOS using IOKit如何使用 IOKit 在 macOS 中以编程方式更改鼠标设置
【发布时间】:2019-10-10 12:14:37
【问题描述】:

函数 IOHIDGetAccelerationWithKeyIOHIDSetAccelerationWithKey 自 macOS 10.12 起已弃用,因此我尝试使用其他 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;
}

【问题讨论】:

  • MachineSettings 是一个私有框架,可以在 /System/Library/PrivateFrameworks 中找到
  • 是否有相关文档?例如。 getEVSHandle 在做什么?我还在stackoverflow.com/questions/49679753/… 中找到了IORegistryEntryFromPath,它可以检索鼠标加速,但不能设置它。我还找到了IOServiceOpen,但是我不确定如何在owningTasktype 参数方面使用它(这似乎被getEVSHandle 所覆盖?)。

标签: objective-c macos kernel mouse iokit


【解决方案1】:

以下作品(使用 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;
}

【讨论】:

  • 您应该在一分钟或一小时内打多少电话有限制吗?有关系吗?因为我想让程序在每次其他人重置加速度时都重置它(例如,通过使用 prefpane 鼠标设置)。
  • 没有记录的限制,我认为如果发生某些事情,您可以通过检查返回的result 是否有错误来控制它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多