Можно ли / безопасно безопасно изменить системные настройки системы мыши OSX, такие как «Скорость отслеживания»? - PullRequest
0 голосов
/ 25 января 2019

Я провел некоторое исследование, и похоже, что оно хранится в IORegistry в разделе ": / IOResources / HIDSystem" как "HIDMouseAcceleration".

Можно ли их установить из пользовательской программы, использующей IORegistry API?

Есть ли другие способы программного изменения настроек системных настроек мыши?

Мой выбор языка программирования - C. Подход должен работать на OS X v10.11 +.

Спасибо.

1 Ответ

0 голосов
/ 25 января 2019

Да, это возможно. Вот примерный код для этого:

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. Я бы тщательно протестировал как можно больше разных аппаратных средств и конфигураций в Системных настройках, чтобы точно определить, какие параметры актуальны и что означают их значения.

...