« Qt Brynhildr(仮称) の その後のこと | トップページ | ブリュンヒルデ(パブリックモード)とQt Brynhildr(仮称)の比較 »

2015年1月31日 (土)

キーボードコントロールを実装しました その5

最後まで残っていた「特殊キー」のイベント取得についてですがプラットフォームのネイティブイベントをフックするAbstractNativeEventFilterインタフェースを継承して、QApplication::installNativeEventFiler()を利用して登録すればWindowsのメッセージ(MSG)をフックできるという仕組みを利用することにしました。

この仕組は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(仮称)の比較 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: キーボードコントロールを実装しました その5:

« Qt Brynhildr(仮称) の その後のこと | トップページ | ブリュンヒルデ(パブリックモード)とQt Brynhildr(仮称)の比較 »