在OS X中以编程为编程的模拟/切换盖



我已经看到了有关此主题的许多帖子。但在任何地方都没有找到明确的答案。

是否有一种方法可以切换oppicition-c或c代码中的盖帽锁定?我不是在寻找使用X11 Libs的解决方案。我对LED开/关状态并不困扰。但是,只有帽子锁的功能(更改字母的情况并在数字键上打印特殊字符)。

为什么CGEVENT不以其他键的方式支持这?

var ioConnect: io_connect_t = .init(0)
let ioService = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching(kIOHIDSystemClass))
IOServiceOpen(ioService, mach_task_self_, UInt32(kIOHIDParamConnectType), &ioConnect)
var modifierLockState = false
IOHIDGetModifierLockState(ioConnect, Int32(kIOHIDCapsLockState), &modifierLockState) 
modifierLockState.toggle()
IOHIDSetModifierLockState(ioConnect, Int32(kIOHIDCapsLockState), modifierLockState)
IOServiceClose(ioConnect)

Objective-C中的以下命令行程序将切换当前盖子锁定状态:

#import <IOKit/IOKitLib.h> // or @import IOKit;
#import <IOKit/hid/IOHIDBase.h> // needed for kIOHIDSystemClass
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // Use kIOMasterPortDefault instead of kIOMainPortDefault for macOS 11.x or earlier
        io_service_t ioService = IOServiceGetMatchingService(kIOMainPortDefault, IOServiceMatching(kIOHIDSystemClass));
        io_connect_t ioConnect = 0;
        IOServiceOpen(ioService, mach_task_self_, kIOHIDParamConnectType, &ioConnect);
        bool state = false;
        IOHIDGetModifierLockState(ioConnect, kIOHIDCapsLockState, &state);
        // Toggle state
        state = !state; // 1 = CapsLock on, 0 = CapsLock off
        IOHIDSetModifierLockState(ioConnect, kIOHIDCapsLockState, state);
        IOServiceClose(ioConnect);
    }
    return 0;
}

当您希望Capslock切换当前键盘语言时,以下方法也可以(如果您配置为Capslock键)。

CFMutableDictionaryRef mdict = IOServiceMatching(kIOHIDSystemClass);
io_service_t ios = IOServiceGetMatchingService(kIOMasterPortDefault, (CFDictionaryRef)mdict);
if (ios) {
    io_connect_t ioc = 0;
    IOServiceOpen(ios, mach_task_self(), kIOHIDParamConnectType, &ioc);
    if (ioc) {
        NXEventData event{};
        IOGPoint loc{};
        // press CapsLock key
        UInt32 evtInfo = NX_KEYTYPE_CAPS_LOCK << 16 | NX_KEYDOWN << 8;
        event.compound.subType = NX_SUBTYPE_AUX_CONTROL_BUTTONS;
        event.compound.misc.L[0] = evtInfo;
        IOHIDPostEvent(ioc, NX_SYSDEFINED, loc, &event, kNXEventDataVersion, 0, FALSE);
        // release CapsLock key
        evtInfo = NX_KEYTYPE_CAPS_LOCK << 16 | NX_KEYUP << 8;
        event.compound.subType = NX_SUBTYPE_AUX_CONTROL_BUTTONS;
        event.compound.misc.L[0] = evtInfo;
        IOHIDPostEvent(ioc, NX_SYSDEFINED, loc, &event, kNXEventDataVersion, 0, FALSE);
        IOServiceClose(ioc);
    }
}

我在漫长的挣扎之后就开始了。

调用以下两次给出的方法。一次参加活动,另一个进行降低活动。例如,用于模拟帽子A,我们需要执行以下操作。

[self handleKeyEventWithCapsOn:0 andKeyDown:NO];
[self handleKeyEventWithCapsOn:0 andKeyDown:YES];

0是'a'。

的键代码
- (void) handleKeyEventWithCapsOn:(int) keyCode andKeyDown:(BOOL)keyDown
{
    if(keyDown)
    {
        CGEventRef eventDown;
        eventDown = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)keyCode, true);
        CGEventSetFlags(eventDown, kCGEventFlagMaskShift);
        CGEventPost(kCGSessionEventTap, eventDown);
        CFRelease(eventDown);
    }
    else
    {
        CGEventRef eventUp;
        eventUp = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)keyCode, false);
        CGEventSetFlags(eventUp, kCGEventFlagMaskShift);
        CGEventPost(kCGSessionEventTap, eventUp);
        // SHIFT Up Event
        CGEventRef eShiftUp = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)56, false);
        CGEventPost(kCGSessionEventTap, eShiftUp);
        CFRelease(eventUp);
        CFRelease(eShiftUp);
    }
}

最新更新