У меня есть приложение, предназначенное для отправки нажатий клавиш в Lightroom. Предполагается, что Lightroom является основным приложением. Он работает правильно в Windows для любой комбинации клавиш / клавиш-модификаторов (код не приведен ниже), но в OSX не работает, если включена клавиша-модификатор Command. Клавиша Command игнорируется. Shift работает, Option работает, но не Command.
Например, shift + command + c (copy) не работает в OS X. Shift + l (гаснет) работает.
Полный код (включая Windows и OS X) находится по адресу https://github.com/rsjaffe/MIDI2LR/blob/master/Source/SendKeys.cpp. Ниже приведена версия, посвященная данной проблеме. Несмотря на то, что это сокращенная версия кода, я включил все «включения», на всякий случай, которые помогут вам понять проблему. Кроме того, я жестко закодировал букву в этом примере и предположил, что английская клавиатура упрощает вещи.
Обратите внимание, что я делаю это в C ++, а не в Objective C. Я пытался избегать использования другого языка, поскольку мое приложение уже использует два языка по необходимости (C ++ и Lua), и мой мозг почти заполнен.
Вопрос: я что-то здесь упускаю из-за обработки клавиш-модификаторов, это проблема с использованием C ++ для этих функций OS X, или это ошибка Lightroom при обработке клавиш?
#include <mutex>
#include <unordered_map>
#include <cctype>
#include <vector>
#include <string>
#import <CoreFoundation/CoreFoundation.h>
#import <CoreGraphics/CoreGraphics.h>
void SendKeys::SendKeyDownUp(bool Option, bool Command, bool Shift) const
{
auto vk = 0x08; //for this example, just use 'c' key, assuming ANSI keyboard
const CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
CGEventRef d;
CGEventRef u;
uint64_t flags = 0;
d = CGEventCreateKeyboardEvent(source, vk, true);
u = CGEventCreateKeyboardEvent(source, vk, false);
if (Command) flags |= kCGEventFlagMaskCommand;
if (Option) flags |= kCGEventFlagMaskAlternate;
if (Shift) flags |= kCGEventFlagMaskShift;
if (flags != UINT64_C(0))
{
CGEventSetFlags(d, static_cast<CGEventFlags>(flags));
CGEventSetFlags(u, static_cast<CGEventFlags>(flags));
}
CGEventPost(kCGHIDEventTap, d);
CGEventPost(kCGHIDEventTap, u);
CFRelease(d);
CFRelease(u);
CFRelease(source);
}
Задача ещё не решена.
Других решений пока нет …