Как стать автором
Обновить

Комментарии 3

Это какой-то прикол? В хабе "разработка под MacOS/iOS" рекомендовать какой-то питон скрипт из трёх строк, который через pyobjc вызывает код на чистейшем Objective-C?

def HIDPostAuxKey(key):
    def doKey(down):
        ev = Quartz.NSEvent.otherEventWithType_location_modifierFlags_timestamp_windowNumber_context_subtype_data1_data2_(
            NSSystemDefined,  # type
            (0, 0),  # location
            0xa00 if down else 0xb00,  # flags
            0,  # timestamp
            0,  # window
            0,  # ctx
            8,  # subtype
            (key << 16) | ((0xa if down else 0xb) << 8),  # data1
            -1  # data2
        )
        cev = ev.CGEvent()
        Quartz.CGEventPost(0, cev)
    doKey(True)
    doKey(False)

вместо маленькой программы на Objective-C, которые тут все наверное умеют написать.

У меня получилось вот так:

@import CoreGraphics;

static const CGEventField kCGEventSubtype = 0x53;
static const CGEventField kCGEventData1 = 0x95;
static const CGEventField kCGEventData2 = 0x96;

static CGEventRef CGEventCreateMediaKeyEvent(CGEventSourceRef _Nullable source, int64_t key, BOOL down) {
    CGEventFlags flags = (down ? NX_KEYDOWN : NX_KEYUP) << 8;

    CGEventRef e = CGEventCreate(source);
    CGEventSetType(e, NX_SYSDEFINED);
    CGEventSetFlags(e, flags);
    CGEventSetIntegerValueField(e, kCGEventSubtype, 8);
    CGEventSetIntegerValueField(e, kCGEventData1, flags | (key << 16));
    CGEventSetIntegerValueField(e, kCGEventData2, -1);
    return e;
}

static void PostKey(CGEventSourceRef _Nullable source, uint64_t key) {
    {
        CGEventRef e = CGEventCreateMediaKeyEvent(source, key, YES);
        CGEventPost(kCGHIDEventTap, e);
        CFRelease(e);
    }
    {
        CGEventRef e = CGEventCreateMediaKeyEvent(source, key, NO);
        CGEventPost(kCGHIDEventTap, e);
        CFRelease(e);
    }
}

int main(int argc, const char * argv[]) {
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
    PostKey(source, NX_KEYTYPE_SOUND_UP);
    CFRelease(source);
    return 0;
}

Более того, статья и в целом совершенно дебильная. Мало того, что рекомендуется разрешить ssh доступ к компьютеру, что я захотел бы делать в последнюю очередь. Так и не объясняется как же всё-таки связать этот скрипт с шорткатом в iOS. Нужно проявить чудеса телепатии, чтобы догадаться, что картинки из README в репозитории, это на самом деле ссылки на экшен в апсторе. Напоследок, остаётся практический вопрос: где гарантия, что мак всегда будет доступен по одному и тому же ip адресу? В статье ничего не говорится о том, как этого достичь.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации