Да, это возможно. Вот примерный код для этого:
io_object_t hidSystemParametersConnection = IO_OBJECT_NULL;
// We're looking for a service of the IOHIDSystem class
CFMutableDictionaryRef classesToMatch = IOServiceMatching("IOHIDSystem");
if (!classesToMatch)
/* handle failure */;
// The following call implicitly releases classesToMatch
io_iterator_t matchingServicesIterator = IO_OBJECT_NULL;
IOReturn ret = IOServiceGetMatchingServices(kIOMasterPortDefault, classesToMatch, &matchingServicesIterator);
if (ret != kIOReturnSuccess)
/* handle failure */;
io_object_t service;
while ((service = IOIteratorNext(matchingServicesIterator)))
{
// Open the parameters connection to the HIDSystem service
ret = IOServiceOpen(service, mach_task_self(), kIOHIDParamConnectType, &hidSystemParametersConnection);
IOObjectRelease(service);
if (ret == kIOReturnSuccess && hidSystemParametersConnection != IO_OBJECT_NULL)
break;
}
IOObjectRelease(matchingServicesIterator);
CFTypeRef value;
ret = IOHIDCopyCFTypeParameter(hidSystemParametersConnection, CFSTR(kIOHIDPointerAccelerationKey), &value);
if (ret != kIOReturnSuccess || !value)
/* handle failure */;
if (CFGetTypeID(value) != CFNumberGetTypeID())
{
CFRelease(value);
/* handle wrong type */
}
NSNumber* accel = CFBridgingRelease(value);
double newAccel = accel.doubleValue / 2;
ret = IOHIDSetCFTypeParameter(hidSystemParametersConnection, CFSTR(kIOHIDPointerAccelerationKey), (__bridge CFTypeRef)@(newAccel));
if (ret != kIOReturnSuccess)
/* handle failure */;
IOServiceClose(hidSystemParametersConnection);
Различные ключи параметров определены и слегка документированы в IOKit.framework / Headers / hid / IOHIDProperties.h и IOKit.framework / Headers / hidsystem / IOHIDParameter.h. Я бы тщательно протестировал как можно больше разных аппаратных средств и конфигураций в Системных настройках, чтобы точно определить, какие параметры актуальны и что означают их значения.