キーボードコントロールを実装しました その5
最後まで残っていた「特殊キー」のイベント取得についてですがプラットフォームのネイティブイベントをフックするAbstractNativeEventFilterインタフェースを継承して、QApplication::installNativeEventFiler()を利用して登録すればWindowsのメッセージ(MSG)をフックできるという仕組みを利用することにしました。
この仕組はQt5.0で実装されたものらしいので、それより前のQtだとQApplication::winEventFilter()という関数を再実装することでWindowsだけならば可能らしいですが、Qt5でより多くのプラットフォームに対応した感じですね。
具体的にはbool nativeEventFilter()というメンバー関数を実装することになります。ここで必要なのはキーイベント(WM_KEYUP/WM_KEYDOWN)の特定のキーに関するイベントのみなので以下の様な感じになります。その他のメッセージはスルーします。
この仕組み自体はWindowsでのみ必要なので、Linuxなどのプラットフォームでは通常のKeyPressイベントなどで対応可能だと思います。
この仕組はQt5.0で実装されたものらしいので、それより前のQtだとQApplication::winEventFilter()という関数を再実装することでWindowsだけならば可能らしいですが、Qt5でより多くのプラットフォームに対応した感じですね。
具体的にはbool nativeEventFilter()というメンバー関数を実装することになります。ここで必要なのはキーイベント(WM_KEYUP/WM_KEYDOWN)の特定のキーに関するイベントのみなので以下の様な感じになります。その他のメッセージはスルーします。
bool MainWindow::nativeEventFilter(const QByteArray &eventType, void *message, long *result) { if (eventType == "windows_generic_MSG"){ MSG *msg = static_cast<MSG *>(message); if (msg->message == WM_KEYUP || msg->message == WM_KEYDOWN){ switch(msg->wParam){ case VK_OEM_AUTO: // 全角/半角キー case VK_OEM_ENLW: // 全角/半角キー case VK_CONVERT: // 変換キー case VK_NONCONVERT: // 無変換キー case VK_OEM_ATTN: // カナ/ひらキー // 上記の4つのキーの押下に関してのみフックする // .. 処理 .. return true; break; default: // その他のキーはスルー return false; break; } } } return false; }
この仕組み自体はWindowsでのみ必要なので、Linuxなどのプラットフォームでは通常のKeyPressイベントなどで対応可能だと思います。
« Qt Brynhildr(仮称) の その後のこと | トップページ | ブリュンヒルデ(パブリックモード)とQt Brynhildr(仮称)の比較 »
« Qt Brynhildr(仮称) の その後のこと | トップページ | ブリュンヒルデ(パブリックモード)とQt Brynhildr(仮称)の比較 »
コメント