gpt4 book ai didi

macos - 将 `fn` 重新映射到 OSX 上的鼠标左键

转载 作者:行者123 更新时间:2023-12-03 16:06:47 24 4
gpt4 key购买 nike

我因为整天点击鼠标而得了严重的肌腱炎。

过去,我使用 Karabiner 重新映射 fn 键来模拟鼠标左键。但是它不适用于 Sierra。

我尝试在 Cocoa 中完成此操作,当我按下并释放 fn 时,它可以正确执行鼠标向下/向上操作。

但是它不处理双击/三击。

此外,在拖动时(例如拖动窗口或选择某些文本),在我按下键盘之前不会发生任何视觉变化,从而完成。

如何调整我的代码来实现此目的?

<小时/>

首先,我创建一个事件点击:

- (BOOL)tapEvents
{
_modifiers = [NSEvent modifierFlags];

if ( ! _eventTap ) {
NSLog( @"Initializing an event tap." );

// kCGHeadInsertEventTap -- new event tap should be inserted before
// any pre-existing event taps at the same location,
_eventTap = CGEventTapCreate( kCGHIDEventTap, // kCGSessionEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
CGEventMaskBit( kCGEventKeyDown )
| CGEventMaskBit( kCGEventFlagsChanged )
| CGEventMaskBit( NSSystemDefined )
,
(CGEventTapCallBack)_tapCallback,
(__bridge void *)(self));
if ( ! _eventTap ) {
NSLog(@"unable to create event tap. must run as root or "
"add privlidges for assistive devices to this app.");
return NO;
}
}
CGEventTapEnable( _eventTap, YES );

return [self isTapActive];
}

现在我实现回调:

CGEventRef _tapCallback(
CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
Intercept* listener
)
{
//Do not make the NSEvent here.
//NSEvent will throw an exception if we try to make an event from the tap timout type
@autoreleasepool {
if( type == kCGEventTapDisabledByTimeout ) {
NSLog(@"event tap has timed out, re-enabling tap");
[listener tapEvents];
return nil;
}
if( type != kCGEventTapDisabledByUserInput ) {
return [listener processEvent:event];
}
}
return event;
}

最后,我实现了一个 processEvent ,它将传递除 fn 键向上/向下之外的任何事件,该事件将转换为鼠标左键向上/向下:

- (CGEventRef)processEvent:(CGEventRef)cgEvent
{
//NSLog( @"- - - - - - -" );

NSEvent* event = [NSEvent eventWithCGEvent:cgEvent];

//NSLog(@"%d,%d", event.data1, event.data2);
//NSEventType type = [event type];

NSUInteger m = event.modifierFlags &
( NSCommandKeyMask | NSAlternateKeyMask | NSShiftKeyMask | NSControlKeyMask | NSAlphaShiftKeyMask | NSFunctionKeyMask );

NSUInteger flags_changed = _modifiers ^ m;
_modifiers = m;

switch( event.type ) {
case NSFlagsChanged:
{
assert(flags_changed);

//NSLog(@"NSFlagsChanged: %d, event.modifierFlags: %lx", event.keyCode, event.modifierFlags);
if( flags_changed & NSFunctionKeyMask ) {
bool isDown = _modifiers & NSFunctionKeyMask;
CGEventType evType = isDown ? kCGEventLeftMouseDown : kCGEventLeftMouseUp;
CGPoint pt = [NSEvent mouseLocation];
CGPoint mousePoint = CGPointMake(pt.x, [NSScreen mainScreen].frame.size.height - pt.y);

CGEventRef theEvent = CGEventCreateMouseEvent(NULL, evType, mousePoint, kCGMouseButtonLeft);
CGEventSetType(theEvent, evType);
CGEventPost(kCGHIDEventTap, theEvent);
CFRelease(theEvent);

//return theEvent;
}

break;
}
}

_lastEvent = [event CGEvent];
CFRetain(_lastEvent); // must retain the event. will be released by the system
return _lastEvent;
}

编辑:Performing a double click using CGEventCreateMouseEvent()

编辑:OSX assign left mouse click to a keyboard key

最佳答案

Karabiner现在适用于 macOS 10.12 及更高版本。

关于macos - 将 `fn` 重新映射到 OSX 上的鼠标左键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44261049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com