キー操作のキャスト

タグの編集
投稿者 FORZA  (社会人) 投稿日時 2008/11/29 05:15:59
VB2008にてWindowsフォームアプリケーションを開発しています。

コントロール上で、ある特定のキーが押された際に
そのコントロールが自動で処理する特殊キー(ChecBoxのSpaceキーなど)と
同じ動作をさせるようなメソッドなどはあるでしょうか?

例えば、CheckBox上でEnterキーが押された場合に
Spaceキーが押されたとみなして、コードではなく
自動で処理させるというものを考えていますが可能ですか?
投稿者   (社会人) 投稿日時 2008/11/29 07:45:11
>そのコントロールが自動で処理する特殊キー(ChecBoxのSpaceキーなど)と
>同じ動作をさせるようなメソッドなどはあるでしょうか?
コントロールの、というかWindowsの既定の(?)動作ですよね。
そういったメソッドはおそらく無いと思いますので、例えばCheckBoxなら自分でCheckedプロパティを切り替えるしかないんじゃないでしょうか。

    Private Sub CheckBox1_KeyDown(ByVal sender As System.ObjectByVal e As System.Windows.Forms.KeyEventArgs) Handles CheckBox1.KeyDown
        If e.KeyCode = Keys.Enter Then
            Dim chk As CheckBox = DirectCast(sender, CheckBox)
            chk.Checked = Not chk.Checked
        End If
    End Sub


投稿者 魔界の仮面弁士  (社会人) 投稿日時 2008/11/29 10:45:40
どういう状況で、何のために使用しようとしているのかにもよりますが、
コントロールの IAccessible インターフェイスを得るようにして、
accDoDefaultAction メソッドを呼ぶという方法が使えるかも知れません。
投稿者 FORZA  (社会人) 投稿日時 2008/12/1 18:56:37
>コントロールの、というかWindowsの既定の(?)動作ですよね。
すみません。例えとしてCheckBoxを挙げてしまいましたが、
VBの標準コントロール以外についても検討していますので、
やはりそのコントロールにデフォルトで備わっている動作ということで考えて頂ければと思います。

説明が不十分ですみません。いくつかあるうちの1つを例として少し補足します。

現在、ある会社の表形式のコントロールを使用しています。
そのコントロールにはPageUp、PageDownキーによるページスクロール機能が
デフォルトで付いているのですが、それと同様の動作を他のキーで行うための
メソッドやプロパティがありません。
そこで他のキーをPageUpやPageDownキーにキャストできればと考えています。

最初の質問の後に、SendKeys.Send(keys)メソッドを見つけたので試してみました。
動作に問題はないのですが、必要としているのは1つのアプリケーション単独での動作ですので
わざわざWindowsに渡して不安定にさせるのではなく、もっと確実な方法はないでしょうか。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2008/12/1 20:55:48
> 現在、ある会社の表形式のコントロールを使用しています。
どれだろう…?

> そこで他のキーをPageUpやPageDownキーにキャストできればと考えています。
そのコントロールを継承して、PreProcessMessage や ProcessKeyMessage 等を
オーバーライドすれば、他のキーを PageUp 等に差し替えられるかも知れません。

そのコントロールが継承できない仕様になっている場合は、KeyPreview = True にした
フォーム側で、キー操作を置き換えられないかどうかを試してみてください。
投稿者 FORZA  (社会人) 投稿日時 2008/12/2 01:30:12
>そのコントロールを継承して、PreProcessMessage や ProcessKeyMessage 等を
>オーバーライドすれば、他のキーを PageUp 等に差し替えられるかも知れません。
魔界の仮面弁士さん、ありがとうございます。上記の内容でできました。

加えてもう1つ、継承云々についてはまったくの勉強不足で申し訳ないのですが、
これらのPreProcessMessageなどはオーバーライドしないと使えないものなのでしょうか?
例えばそのコントロールのKeyDownイベントに直接、Control.PreProcessMessage(Msg)
とするのはだめですか?