Mac OSX 10.6에서 모든 키보드 및 마우스 이벤트를 삭제하는 코드를 작성하려고합니다. 내 코드는 루트 사용자로 실행됩니다. 내가 취하고있는 접근법은 전달 된 모든 이벤트를 삭제하는 이벤트 탭을 만드는 것입니다 (활성화 된 상태에서). 이벤트 탭 콜백 함수는 다음과 같습니다Mac 이벤트 탭에서 버려진 이벤트가 지연됩니다.
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";
}
}
이 방법을 작동 아주 잘 동안 이벤트 탭 활성화되어 있습니다 - 나는 원하는대로 키보드와 마우스를 망가 트릴 수 있으며 시스템을 통해 이벤트가 발생하지 않습니다. 그러나 탭이 비활성화되어있을 때 탭이 활성 상태 인 동안 푸시 한 모든 키가 현재 창에 나타납니다. 이벤트 탭에서 이벤트를 지연시키는 것보다는 맥 오에스 문서에서 명확히 말합니다 :
이벤트 탭이 활성 필터 인 경우 콜백 함수는 다음 중 하나를 반환해야합니다. 다음과 같습니다.
전달 된 (수정 된) 이벤트.이 이벤트는 이벤트 시스템으로 다시 전달됩니다.
새로 생성 된 이벤트입니다. 새 이벤트가 이벤트 시스템으로 다시 전달되면 새 이벤트가 원래 이벤트와 함께 해제됩니다.
전달 된 이벤트가 삭제되면 NULL입니다.
NULL을 반환하지만 이벤트가 삭제 된 것 같습니다. 어떤 아이디어?
당신은이 문제를 해결 했습니까? 방금 똑같은 행동을했습니다. – Dan
아니요, 불행히도 아닙니다. – Thomi
또한보십시오 http://stackoverflow.com/questions/4518559/consuming-osx-mouse-trackpad-events-with-an-event-tap – James