1

キーストロークを Lightroom に送信するように設計されたアプリケーションがあります。Lightroom がフォアグラウンド アプリケーションであることを前提としています。Windows では任意のキーストローク/修飾キーの組み合わせ (コードは以下に含まれていません) に対して正しく機能しますが、OSX では Command 修飾キーが含まれていると機能しません。Command キーは無視されます。Shift は機能し、Option は機能しますが、Command は機能しません。

たとえば、Shift+command+c (コピー) は OS X では機能しません。Shift+l (消灯) は機能します。

完全なコード (Windows と OS X を含む) はhttps://github.com/rsjaffe/MIDI2LR/blob/master/Source/SendKeys.cppにあります。以下は、当面の問題に焦点を当てたバージョンです。これはコードの省略版ですが、問題を理解するのに役立つ場合に備えて、すべての「インクルード」を含めました。また、この例では文字をハードコーディングし、簡単にするために英語のキーボードを想定しています。

Objective C ではなく C++ でこれを行っていることに注意してください。別の言語の使用を避けようとしています。私のアプリは必要に応じて既に 2 つの言語 (C++ と Lua) を使用しており、私の脳はほぼいっぱいです。

質問: 修飾キーの処理に関して何か不足していますか? これは、これらの OS X 関数に C++ を使用する際の問題ですか、それともキー処理における 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