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?
没有评论:
发表评论