我已经看到了有关此主题的许多帖子。但在任何地方都没有找到明确的答案。
是否有一种方法可以切换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);
}
}