【发布时间】:2010-05-12 09:57:40
【问题描述】:
我正在尝试编写一些在 Mac OSX 10.6 上启用时丢弃所有键盘和鼠标事件的代码。我的代码以 root 用户身份运行。我正在采取的方法是创建一个事件点击,丢弃所有传递给它的事件(启用时)。事件点击回调函数如下所示:
CGEventRef MyTapCallback(CGEventTapProxy proxy,
CGEventType type,
CGEventRef event,
void *refcon)
{
return CKeyLocker::isEnabled() ? NULL : event;
}
我用来启用和禁用事件点击的代码如下所示:
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";
}
}
当事件点击处于活动状态时,这种方法非常有效 - 我可以随意敲击键盘和鼠标,并且没有任何事件通过系统。但是,当点击被禁用时,我在点击处于活动状态时按下的所有键都会出现在当前窗口中。就像事件点击只是延迟事件,而不是破坏它们,这很奇怪,因为 Mac 文档明确指出:
如果事件点击是一个活动过滤器,你的回调函数应该返回以下之一:
传入的(可能已修改的)事件。此事件被传回事件系统。
一个新建的事件。新事件传回事件系统后,新事件将与原事件一起释放。
如果要删除传入的事件,则为NULL。
我返回 NULL,但该事件似乎没有被删除。有什么想法吗?
【问题讨论】:
-
这个问题你解决了吗?我刚刚遇到了完全相同的行为。
-
看起来上面链接的问题有答案
标签: c++ macos events quartz-graphics macos-carbon