我有一个旨在将击键发送到 Lightroom 的应用程序。它假定 Lightroom 是前台应用程序。对于任何击键/修饰键组合(代码未包含在下面),它在 Windows 中都能正常工作,但在 OSX 中,如果包含命令修饰键,它就不起作用。Command 键被忽略。Shift 有效,Option 有效,但 Command 无效。
例如,shift+command+c(复制)在 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);
}