none
OnPreViewKeyDownについて RRS feed

  • 質問

  • OnPreviewKeyDownメソッドにていくつか質問があります

     

    Enterでフォーカス移動やファンクション割り当てなど、親ウィンドウで一括でキー処理したい場合など、親ウィンドウ(Form)にOnKeyDownメソッドを追加して、そのメソッド内で押されたKeyを判断し、フォーカス移動の処理を行っています

    ※特殊キーを判断する必要がないので、今のところOnKeyDownで十分です

     

    ですが、仮に「特殊キー」を親ウィンドウで一括で判断したい場合には、どのようにすればよいのか分かりません

    最初は親ウィンドウにOnPreviewKeyDownメソッドを追加して判断すれば出来ると思っていたのですが、親ウィンドウのOnPreviewKeyDownには何のキーを押してもメッセージが飛んできていません

    親ウィンドウに配置されているコントロール(TextBoxなど)のOnPreviewKeyDownメソッドで、特殊キーを通常のキーとして処理(IsInputKeyをtrue)してやることで、親ウィンドウのOnKeyDownメソッドにて処理することはわかるのですが、すべてのコントロールにこれを設定するのは面倒です

     

    親ウィンドウのOnPreviewKeyDownメソッドは何の用途で使うものなのでしょうか?そもそも何のキーを押しても親ウィンドウのOnPreviewKeyDownメソッドに飛んでこないのは仕様なんでしょうか?

     

    自前で親ウィンドウのプリプロセスメソッド(ProcessCmdKeyやIsInputKey)をオーバーライドすれば、親ウィンドウでも特殊キーを取得できることは確認しましたが、そもそもこの方法が標準的な方法なのでしょうか?

    .net framework2.0まではPreviewKeyDownが存在していなかったため、プリプロセスメソッドを自分でオーバーライドする必要がありましたが、2.0以降であっても親ウィンドウではオーバーライドするしか方法がないのでしょうか?

     

    あと、OnPreviewKeyDownメソッドはどこから呼ばれているメソッドなのでしょうか?

     

    OnKeyDownなどのメソッドは、PrecessKeyEventArgsメソッドから呼ばれ、その呼び元のメソッド(プリプロセスやキーイベントプロセス)で親コントロールのメソッドを呼び出すため、親コントロールでもOnKeyDownが発生することはわかっているのですが、OnPreviewKeyDownメソッドだけは何のメソッドから呼ばれるのか調べてもわからず、親ウィンドウのOnPreviewKeyDownを呼び出す方法があるのか?ないのか?の調査ができませんでした

     

    簡潔な説明で分かりにくいかと思いますが、どなたかご回答よろしくお願いいたします

    2011年10月13日 6:50

回答

  • 自前で親ウィンドウのプリプロセスメソッド(ProcessCmdKeyやIsInputKey)をオーバーライドすれば、親ウィンドウでも特殊キーを取得できることは確認しましたが、そもそもこの方法が標準的な方法なのでしょうか?

    フォーカス制御などにはコンテナ(親コントロール、一般的には Form または UserControl の派生)の IsInputKey および ProcessDialogKey を使用すべきでしょう。そのために用意されているメソッドですし。

    親ウィンドウのOnPreviewKeyDownメソッドは何の用途で使うものなのでしょうか?そもそも何のキーを押しても親ウィンドウのOnPreviewKeyDownメソッドに飛んでこないのは仕様なんでしょうか?

    PreviewKeyDown は MSDN の解説に「フォーカスがあるとき」って書かれている以上、フォーカスを受け取ることのないコントロールではまあ死にイベントということではないでしょうかね。詳しく確認してませんが。

    あと、OnPreviewKeyDownメソッドはどこから呼ばれているメソッドなのでしょうか?

    どこから呼ばれているか確認するには、とりあえずオーバーライドしてブレイクポイントを張っておいて、呼び出し履歴を確認すれば分かるかと思います。各入力の処理順を確認したいなら、一通りオーバーライドした上で base の基本実装を呼び出す前後にデバッグ出力を吐くようにしておけば流れも掴めるのではないでしょうか。

    • 回答の候補に設定 山本春海 2011年11月7日 8:34
    • 回答としてマーク 山本春海 2011年11月9日 7:44
    2011年10月13日 7:29