4

Backstory:

I want to write a C program to automate clicks in a program running in OSx (in a desktop setting).

I first tried Using Quartz Event Services to simulate input events. But then I had this problem: Simulating mouse clicks on Mac OS X does not work for some applications, and the answers didn't help in my case.

CGEventRef click1_down = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, CGPointMake(posx, posy), kCGMouseButtonLeft);
CGEventSetIntegerValueField(click1_down, kCGMouseEventClickState, 0);
// This down click works about 5% of the time.
CGEventPost(kCGHIDEventTap, click1_down);
usleep(30000);

CGEventRef click1_up = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, CGPointMake(posx, posy), kCGMouseButtonLeft);
CGEventSetIntegerValueField(click1_up, kCGMouseEventClickState, 1);
CGEventPost(kCGHIDEventTap, click1_up);

// I've tried every combination of CGEventSetIntegerValueField, usleep and CFRelease, nothing seems to help
// The only thing helping is repeating the line: "CGEventPost(kCGHIDEventTap, click1_down);" 100s of times, 
// then the down click works about 80% of the time, still not acceptable

I'm now turning to solution #3 suggested here: How can Mac OS X games receive low-level keyboard input events?

(this might also help How can I simulate the touch events by IOHIDEvent?)

I tried with Karabiner by sending a mouse click on key press:

<item>
  <name>Right Mousebutton</name>
  <identifier>rightMouseButton</identifier>
  <autogen>__KeyToKey__ KeyCode::H, PointingButton::LEFT</autogen>
</item>

And this sends the click 100% of the time, but I want to send the click with by writing C code (to have greater control). Tough I'm not sure, Karabiner seems to use IOKit to send events, so I think this should work in my case, if I'm able to send mouse events with IOKit.


So my question is basically: how do I write a C program to simulate a mouse left click with IOKit ? The documentation is very sparse and I didn't manage to do it.

I tried getting inspiration from some projects:

Community
  • 1
  • 1
Benjamin Crouzier
  • 40,265
  • 44
  • 171
  • 236
  • 1
    Did you ever manage to find some decent resources or documentation on this? I found [this](https://github.com/ccMSC/ckb/blob/master/src/ckb-daemon/input_mac.c) which I was able to adapt to suit my needs. It seems like even StackOverflow is lacking in I/O Kit experts! – Indiana Kernick Feb 10 '21 at 01:17

0 Answers0