2

私は現在、マルチメディア キーの 1 つでキーを押すことをエミュレートする小さな C/C++ プログラムを作成しようとしています (「一時停止/再生」など)。

キープレスをシミュレートするために、 -library のXTestFakeKeyEvent-functionを使用しました。X11SO: Simulate keypress in a Linux C console application で実際の例を見つけました

私の問題は、シミュレートしようとしている特殊キーがkeysymdef.h、使用される関数の定数XKeysymToKeycodeが定義されているファイルに見つからないことです。

それで、私は少し調査を行い、この投稿を見つけて、xmodmap-commandにたどり着きました。を使用xmodmap -pkして、これらのキーを含むリストを取得しました:

KeyCode Keysym (Keysym) ...
Value   Value   (Name)  ...
[...]
171     0x1008ff17 (XF86AudioNext)  0x0000 (NoSymbol)   0x1008ff17 (XF86AudioNext)  
172     0x1008ff14 (XF86AudioPlay)  0x1008ff31 (XF86AudioPause) 0x1008ff14 (XF86AudioPlay)  0x1008ff31 (XF86AudioPause) 
173     0x1008ff16 (XF86AudioPrev)  0x0000 (NoSymbol)   0x1008ff16 (XF86AudioPrev)  
174     0x1008ff15 (XF86AudioStop)  0x1008ff2c (XF86Eject)  0x1008ff15 (XF86AudioStop)  0x1008ff2c (XF86Eject)  
[...]

これらの定義された値 (172再生/一時停止など) を -function のキーコードとして使用すると、XTestFakeKeyEvent機能するようになりました。

// Simulate Key-Press:
Display *display;
display = XOpenDisplay(NULL);

XTestFakeKeyEvent(display, 172, true, 0);
XTestFakeKeyEvent(display, 172, false, 0);
XFlush(display);

さて、私の質問は次のとおりです。

これらの値 (整数) を信頼して、すべての Linux システムでこれらのキーにマップすることはできますか? そうでない場合 (これは私が推測することです)、正しいマッピングを動的に (コードで) 取得する適切な方法は何でしょうか?

4

1 に答える 1

2

これが決定的な答えではないことはわかっていますが、私の経験では(同様のプロジェクトで)、試したすべてのLinuxマシンでキーマッピングが同じでした. これは、EN/US キーボード レイアウトのマシンでのみ発生します。代替レイアウトのキーボードについて話すことはできません。

これがあなたの質問に完全に答えていない場合は申し訳ありません。

編集:

私は実際に私の古いプロジェクトを見て、実際のキーコードを取得するためにこれらの関数を使用したようです:

XStringToKeysym()
XKeysymToKeycode()

MANページを見てください。かなり自明です。

これが役に立ったことを願っています:)

于 2011-12-01T03:18:18.787 に答える