Tho*_*omi 18 c++ macos events macos-carbon quartz-graphics
我正在尝试编写一些在Mac OSX 10.6上启用时丢弃所有键盘和鼠标事件的代码.我的代码以root用户身份运行.我正在采取的方法是创建一个事件点击,丢弃传递给它的所有事件(启用时).事件点击回调函数如下所示:
CGEventRef MyTapCallback(CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
void *refcon)
{
return CKeyLocker::isEnabled() ? NULL : event;
}
Run Code Online (Sandbox Code Playgroud)
我用来启用和禁用事件tap的代码如下所示:
void CKeyLocker::enable(bool bEnable)
{
if (bEnable == m_bEnabled)
return;
if (bEnable)
{
// which events are we interested in?
CGEventMask evMask = kCGEventMaskForAllEvents;
CFMachPortRef mp = CGEventTapCreate(kCGHIDEventTap,
kCGHeadInsertEventTap,
kCGEventTapOptionDefault,
evMask,
MyTapCallback,
NULL);
if (mp)
{
qDebug() << "Tap created and active. mp =" << mp;
m_enabledTap = mp;
m_bEnabled = true;
}
}
else
{
CGEventTapEnable(m_enabledTap, false);
CFRelease(m_enabledTap);
m_enabledTap =0;
m_bEnabled = false;
qDebug() << "Tap destroyed and inactive";
}
}
Run Code Online (Sandbox Code Playgroud)
事件点击处于活动状态时,此方法非常有效 - 我可以根据需要在键盘和鼠标上敲击,并且没有任何事件通过系统.但是,当点击被禁用时,我在点击激活时按下的所有键都出现在当前窗口中.这就像事件点击只是推迟事件,而不是摧毁它们,这很奇怪,因为Mac文档明确指出:
如果事件tap是活动过滤器,则回调函数应返回以下之一:
传入的(可能已修改的)事件.此事件将传递回事件系统.
新建的活动.将新事件传递回事件系统后,新事件将与原始事件一起发布.
如果要删除传入的事件,则为NULL.
我正在返回NULL,但事件似乎没有被删除.有任何想法吗?
我可以验证返回 NULL 确实有效地删除了一些事件,但我也见过几次它没有删除的情况,具体如何决定允许哪些删除尚不清楚,但看起来大规模删除似乎被阻止了,例如:当您删除超过连续 100 个左右的事件。