1

我有一个旨在将击键发送到 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);

}
4

0 回答 0