I have created a CGEventTap like this:
GetCurrentProcess(psn);
var mask = 1 << kCGEventLeftMouseDown | // CGEventMaskBit(kCGEventLeftMouseDown)
You can't run a run loop in kCFRunLoopCommonModes
. This is clearly stated in the documentation for CFRunLoopRunInMode()
.
kCFRunLoopCommonModes
is a virtual mode. It's basically a set of other modes. It can only be used when adding (or removing) a source to a run loop to say "monitor this source when the run loop is run in any of the modes in the set". But when you run a run loop, you have to run it in a specific, real mode, not this virtual mode which represents a set of other modes.
I recommend that, when you're working on a private thread and only want to monitor private sources, that you add the source to a custom mode and run the run loop in that mode. A custom mode is just a string with a unique value. For example, something like "com.yourcompany.yourproject.yourmodespurpose". Using a custom mode makes sure that the run loop never does anything unexpected, like firing a source added by the frameworks.
You must not release aLoop
. Functions that don't have "Create" or "Copy" in their name do not give you ownership.
You will need a loop around your call to CFRunLoopRunInMode()
because it will return every time it handles an event from your source (kCFRunLoopRunHandledSource
== 4) or hits the timeout (kCFRunLoopRunTimedOut
== 3). You should break out of the loop if it ever returns anything else.