2017-08-09 17 views
0

macOSでは、キーの組み合わせCMD+Backtickを使用して、英語のキーボードを使用しているときにアプリケーションの開いているウィンドウを切り替えることができます。たとえば、ドイツ語のキーボードでは、組み合わせはCMD+<です。このショートカットは、System Preferences - >Keyboard - >Shortcuts - >Keyboard - >Move focus to next windowを使用して設定することもできます。システム環境設定でプログラムによって設定されたmacOSキーボードショートカットを取得するには?

FLTKを使用している私のマルチウィンドウのGUIアプリケーションでは、このショートカットを利用したいが、ユーザが自分のシステムに設定した組み合わせをどのように取得するのか分からない。だから私が探しているのは、このMacのMove focus to next windowに使用されているキーの組み合わせを与えるmacOSシステムコールです。

もちろん、FLTKを使ってやや組み込みの方法があるのであれば、ネイティブシステムコールを使用する必要はありません。この問題のためにグーグルで

アップデート2017年8月10日 OOのanswerは、追加の研究のために私にいくつかのアイデアを与えた...悪夢です。 ASCIIコードが「B」のためだそれ:私は以来、好みがキー27

 27 =   { 
     enabled = 1; 
     value =    { 
      parameters =     (
       98, 
       11, 
       524288 
      ); 
      type = standard; 
     }; 
    }; 

パラメータ1(98)には、より正確には、com.apple.symbolichotkeysに格納されていることを学びました。最初のパラメータには、ショートカットのASCIIコードが使用されます。ASCII文字以外の場合は65535です。

パラメータ2(11):これはkVK_ANSI_B(source)のキーボードコードです。これらのコードはキーボードによって異なります。米国のキーボードではkVK_ANSI_Zは0x06、ドイツ語のキーボードでは0x10です。

パラメータ3(524288):修飾キーのためです:

0x000000 => "No modifier", 
0x020000 => "Shift", 
0x040000 => "Control", 
0x080000 => "Option", 
0x100000 => "Command", 

(0x80000が524288.に等しい)

だから私の仕事は、単に取得、defaults read com.apple.symbolichotkeysの出力を解析するためのようですパラメータの辞書からのキーの組み合わせは、キーボードレイアウトに応じてこれらの組み合わせを正しく解釈し、これらの情報をFLTKアプリケーションでコールバックを設定するために使用します。

+0

AppleScriptを使用している可能性があります。簡単なgoogle検索では、[this](http://www.macosxautomation.com/applescript/features/system-prefs.html)が生成されます。 AppleScriptコードは、bashで[osascript](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/osascript.1.html)を使用して呼び出すことができます(C++のシステムコールを使用) 。 – scohe001

答えて

1

は、私は今、答えをテストすることはできません...しかし、私は最初defaultsコマンドのようにpopenにしようとするだろう:私はちょうどprintf、その出力が、あなたがそうなるでしょう。ここ

HFILE file; 
if (!(file = popen("defaults read NSGlobalDomain NSUserKeyEquivalents", "r"))) 
{ 
    return nullptr;  
} 
const int MAX_BUF_SIZE = 512; 
char temp[MAX_BUF_SIZE+1] = ""; 
while (fgets(temp, MAX_BUF_SIZE, file) > 0) 
{ 
    printf("%s",temp); 
    memset(temp, 0, MAX_BUF_SIZE+1); 
} 
pclose(file); 

はそれを解析します。

+0

私はちょうど '(kCFPreferencesAnyApplication、NSUserKeyEquivalents)のドメイン/デフォルトペアは存在しません。しかし、あなたの答えは私に検索語のための追加のアイデアを与えました。私はいくつかの情報で私の質問を更新します。 – z80crew

関連する問題