gpt4 book ai didi

c++ - 如何使用c++在MAC OS中捕获鼠标事件

转载 作者:行者123 更新时间:2023-11-30 04:19:23 63 4
gpt4 key购买 nike

我想在 Mac 操作系统中捕获鼠标右键和左键单击并使用以下代码:


CGEventRef event = CGEventCreate(NULL);
CGEventType eventType = CGEventGetType(event);

cout << "mouse event type is : " << eventType << endl;

我使用此代码查看事件类型,例如必须是 kCGEventLeftMouseDown 或显示事件类型的整数值,但此代码不捕获鼠标事件并返回 0

最佳答案

这应该如何做任何事 :D 您需要捕获现有事件……您只需调用一个助手并创建一个新事件……但它非常简单。

查看CGEventTap,它可以满足您的需求。

鉴于操作系统已启用辅助功能,事件点击在整个系统范围内工作!


一些代码:

//called for each event
static CGEventRef myCGEventCallback(CGEventTapProxy proxy,
CGEventType t,
CGEventRef event,
void *refcon);

- (void)threaded_listenForDrags {
if (!_eventTap)
{
int eventMask = CGEventMaskBit(kCGEventLeftMouseDown)
| CGEventMaskBit(kCGEventLeftMouseUp)
| CGEventMaskBit(kCGEventLeftMouseDragged)
| CGEventMaskBit(kCGEventRightMouseDragged)
| CGEventMaskBit(kCGEventOtherMouseDragged);

_eventTap = CGEventTapCreate(kCGHIDEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionListenOnly,
eventMask,
myCGEventCallback,
(__bridge void*)self);
if (!_eventTap)
{
DDLogError(@"%@ no tap; universal access?", NSStringFromSelector(_cmd));
return;
}
CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(NULL,
_eventTap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource,
kCFRunLoopCommonModes);

CFRelease(runLoopSource);
}
CGEventTapEnable(_eventTap, true);

CFRunLoopRun();
}

- (void)threaded_endListenForDrags {
CFMachPortRef et = _eventTap;

CGEventTapEnable(_eventTap, false);
_eventTap = nil;

dispatch_sync(dispatch_get_main_queue(), ^{
if(_enabled) {
_enabled = NO;
[self setEnabled:YES];
}
});

CFRunLoopStop(CFRunLoopGetCurrent());
CFRelease(et);
}

关于c++ - 如何使用c++在MAC OS中捕获鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15860442/

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