キーボードコントロールを実装しました その5
この仕組は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イベントなどで対応可能だと思います。
最近のコメント