CGEventPost - possible bug when simulating keyboard events?

前端 未结 6 1288
挽巷
挽巷 2020-12-01 05:04

I have a very simple chunk of code that is designed to simulate keyboard events. The simple example below should type \"Cz\" - the shift key goes down, the c key goes down,

6条回答
  •  一生所求
    2020-12-01 05:23

    Like another comment referring to other solutions here, after using uppercase with the Shift mask, a successive call would cause any further intended non-shifted character to be turned into an shifted characters. I figured the call to CGEventCreateKeyboardEvent was somehow saving previous masks, so I purposefully clear the mask of the modifier:

    CGEventRef event1, event2;
    
    CGEventSourceRef source = CGEventSourceCreate (kCGEventSourceStateCombinedSessionState);
    CGEventFlags flags;
    
    event1 = CGEventCreateKeyboardEvent (source, keyCode, true);
    if (upper)
        flags = kCGEventFlagMaskShift | CGEventGetFlags(event1);
    else
        flags = ~kCGEventFlagMaskShift & CGEventGetFlags(event1);
    
    CGEventSetFlags(event1, flags);
    CGEventPost(kCGHIDEventTap,event1);
    
    event2 = CGEventCreateKeyboardEvent (source, keyCode, false);
    if (upper)
        flags = kCGEventFlagMaskShift | CGEventGetFlags(event2);
    else
        flags = ~kCGEventFlagMaskShift & CGEventGetFlags(event2);
    CGEventSetFlags(event2, flags);
    CGEventPost(kCGHIDEventTap,event2);
    CFRelease(event1);
    CFRelease(event2);
    CFRelease(source);
    

提交回复
热议问题