2020年12月19日星期六

Is there a way to detect if the SHIFT key is pressed in C++? (Mac OSX)

I am making a kind of key detector so that I can overlay what keys I press whenever I record my screen for gameplay. For example, in the recording, I would be able to see wether I was pressing W or holding down Space.

Currently, I have a key listener that listens to keys W, A, S, D and Space. The code was also supposed to capture the left shift key, but for some reason it does not. When I hold down the shift key, the output is

00000000

when I expect it to be

00001000.

Code:

  #include <iostream>  #include <ApplicationServices/ApplicationServices.h>  #include <CoreFoundation/CoreFoundation.h>  #include <CoreGraphics/CoreGraphics.h>  #include <thread>  #include <chrono>  bool w = false;  bool a = false;  bool s = false;  bool d = false;  bool spc = false;  bool shf = false;  bool lmb = false;  bool rmb = false;  void tread() {      while (true) {          std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();          std::cout << w << a << s << d << shf << spc << lmb << rmb << "\n";          std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();          uint64_t timedifference = std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count();          uint64_t sleeptime = 20000;          usleep((unsigned int)(sleeptime-timedifference));      }  }    CGEventRef CGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {      if (type != kCGEventKeyDown && type != kCGEventFlagsChanged && type != kCGEventKeyUp && type != kCGEventLeftMouseUp && type != kCGEventLeftMouseDown && type != kCGEventRightMouseUp && type != kCGEventRightMouseDown) { return event; }      bool setTo = (type == kCGEventKeyDown ? true : false);      if (type == kCGEventKeyDown || type == kCGEventKeyUp) {          switch ((int) CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode)) {              case 13: w = setTo; break;              case  0: a = setTo; break;              case  1: s = setTo; break;              case  2: d = setTo; break;              case 56: shf = setTo; break;              case 49: spc = setTo; break;          }      }      if (type == kCGEventLeftMouseDown || type == kCGEventRightMouseDown || type == kCGEventLeftMouseUp || type == kCGEventRightMouseUp) {          switch (type) {              case  kCGEventLeftMouseDown: lmb = true;  break;              case kCGEventRightMouseDown: rmb = true;  break;              case    kCGEventLeftMouseUp: lmb = false; break;              case   kCGEventRightMouseUp: rmb = false; break;          }      }      return event;  }    int main(int argc, const char * argv[]) {      std::thread tred(tread);      tred.detach();      CGEventMask eventMask = (CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventKeyUp) | CGEventMaskBit(kCGEventFlagsChanged) | CGEventMaskBit(kCGEventLeftMouseDown) | CGEventMaskBit(kCGEventLeftMouseUp) | CGEventMaskBit(kCGEventRightMouseDown) | CGEventMaskBit(kCGEventRightMouseUp));      CFMachPortRef eventTap =  CGEventTapCreate(                                         kCGAnnotatedSessionEventTap,                                         kCGTailAppendEventTap, // kCGHeadInsertEventTap                                         kCGEventTapOptionListenOnly,                                         eventMask,                                         CGEventCallback,                                         NULL );      CFRunLoopSourceRef runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);      CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);      CGEventTapEnable(eventTap, true);      CFRunLoopRun();              return 0;  }  

I know that the key code for the Shift key is 56. I tried some code on a Windows computer with GetAsyncKeyState(0x10) and it worked properly. Any ideas why it would not work on Mac computers?

https://stackoverflow.com/questions/65376878/is-there-a-way-to-detect-if-the-shift-key-is-pressed-in-c-mac-osx December 20, 2020 at 12:16PM

没有评论:

发表评论