人生最悪の忘れ物

C#プログラムで、ボタンをショートカットキー付きで作りたいのですが、方法が分からず困っています。
方法が分からない点は、クリックイベントとKeyDownイベントに対して同一のイベントハンドラーにする方法です。サンプルがあったらご提示頂けないでしょうか?

A 回答 (2件)

 Button等のコントロールには直接ショートカットキーを指定できませんので、KeyDownイベント等でキー状態で判別するしかありません。



> クリックイベントとKeyDownイベントに対して同一のイベントハンドラーにする方法

 以下はかなりトリッキーな方法なので、素直にClickとKeyDownとで別々にイベントハンドラを作って、共通の処理メソッドを呼び出す方法を推奨します。
(ショートカットキーが「Ctrl + A」の時)

// InitializeComponent()の中
// またはButtonの動的生成場所
this.button1.Click += new System.EventHandler(this.button1_Click);
this.button1.KeyDown += new System.Windows.Forms.KeyEventHandle(this.button1_Click);

// 共通のイベントハンドラ
private void button1_Click(object sender, EventArgs e)
{
if (e.ToString() == "System.Windows.Forms.KeyEventArgs") {
// KeyDownのイベントならキー状態を判別
KeyEventArgs k = (KeyEventArgs)e;
if (!(k.Control && (k.KeyCode == Keys.A))) {
// Ctrl + A 以外のKeyDownは除外
return;
}
}
// イベントの処理
}
    • good
    • 0
この回答へのお礼

ご丁寧なご回答を頂きましてありがとうございました。とても参考になりサンプルの方法をそっくり適用させて頂き、目的の機能をを実現することができました。非常にありがたく感謝いたしております。
私が作成中のプログラムの背景と今後の課題とを参考までに説明申し上げます。
視覚障害者のグループからC#を学びたいとの要望があり、基礎学習から皆様と勉強を始め、これまで当方からたくさんのサンプルプログラムを提供しております。これらのプログラムではボタンの選択時に、連続したタブキー操作により各ボタン名を音声表示するようにしております。ところが慣れてくると連続タブキー操作で目的の機能ボタンを探すのは、手間がかかり効率の悪さが問題になっており、目的機能ボタンを一発で使いたいと強く求めらておりました。彼等の記憶力は常人より格段に強く、プログラム利用2回ぐらいで、全てのボタン名を覚えてしまうので、この要望も無理ももないと思います。
今回のご教示頂きました方法では、目的ボタンにフォーカスがないと、ショトカットキーが働かないことが判りましたので、多少の変更を加えてみました。まずフォーム上でショートカットキーを受け取り、キーによりボタン判別を行い、そのボタンにフォーカスを当て、もう一度ショートカットキーを押して貰うようにし、その段階でご教示の方法を使っております。これでほぼ満足のできるレベルになったのではないかと思っておりますが、ショートカットキーの二回押しではなんともスマートでなく、今後の課題になっております。
また質問投稿した場合はどうかお助けくださいますようお願いいたします。本当にありがとうございました。

お礼日時:2010/07/30 23:25

C#知らないんでとんでもない事をいっているのかもしれませんが


ショートカットキーってキャプションに & つければそれで終わりと違うんでしょうか?
  言語違いますがそうするだけでそのショートカットで
  クリックイベントが発生したと記憶しています

仮にそうならないならKeyDounイベントでそのボタンへのクリックイベントを
飛ばすってのはダメでしょうか?
  場合によっては直接イベント関数コールしてもいいような気がするんですが
  問題あるんでしょうか?(これならサンプル言うほどのこと無いですよね?)
    • good
    • 4

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報