DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ESCキーに対応するボタンを設定しているのに認識しない

環境/言語:[Framework1.1SP1 C#]
分類:[.NET]

今作っているプログラムでフォーム上から参照ボタンクリックで
モーダルダイアログを表示し日付を選択するというルーチンを
作っているのですが、このモーダルダイアログの方でESCキーで
ダイアログを閉じる処理を追加したいのですが出来ずに困っています。
FormのCancelButtonプロパティにクリックでダイアログを閉じる
BtnCloseボタンを対応させているのですが、上手く働いてくれません。
どなたか同じような現象で悩んでいた方お願いします。

//呼び出し元
DlgSelCal dlg = new DlgSelCal(); //日付選択ダイアログ
DateTime dt = dlg.ShowDialog();
dlg.Dispose();

//ダイアログのコンストラクタ
public DlgSelCal()
{
//中略
this.CancelButton = BtnClose; //ESCキーに対応するボタンの設定
}

private void BtnClose_Click(object sender, EventArgs e)
{
this.close();
}
理由が分かりました。
ESCでフォームを閉じたいのですが、閉じるボタンを表示させたくないという
理由からBtnCloseのVisibleをFalse設定にしていたためです。
しかしやはりこのボタンは表示させておきたくないのですが何かよい方法
はないでしょうか?
FormのCancelButtonプロパティを使わなくてもいいのですが、ESCキーで
フォームを閉じる方法をお願いします。
■No18556に返信(チャバさんの記事)

せっかくどぼん!さんのサイトで質問してるのだから、どぼん!さんの
書いているTipsには目を通しておいたほうがいいと思いますよ。

ヒント:http://dobon.net/vb/dotnet/form/keypreview.html
> ヒント:http://dobon.net/vb/dotnet/form/keypreview.html

返答が遅くなり申し訳ありません。
Keypreviewのプロパティの事はよく知っており、当然試しております。
それでも認識できませんでしたので、ちょっと調べました。
ESCやファンクションキーはコントロールにデフォルトの操作が
割り当てられている場合はそちらを優先するとの情報がありました。
なのでESCキーはKeyPreviewでもフォームで取得しようとしても
KeyDownイベントなどで認識できなかったようです。
■No18632に返信(チャバさんの記事)

> Keypreviewのプロパティの事はよく知っており、当然試しております。

私はエスパーではないので、そういった話は先に書いていただかなければわかりません。

> それでも認識できませんでしたので、ちょっと調べました。

確かに CancelButton などに割り当てられたボタンがある場合は、ESCキーを押した時点でボ
タンが優先されるようですね。
で、調査はそこで終了されたのでしょうか。私が書いた『ヒント』はご覧になっているかと思い
ますが、ヒントであって回答そのものではない、というところに注意してください。

ヒントで示したページの中に
 Buttonコントロールにフォーカスがあるとフォームで矢印キーのキーイベントが発生しない
 http://dobon.net/vb/dotnet/form/keypreview2.html
というページへのリンクがあるかと思います。

こちらを使えばESCキーの取得も可能かと思いますが、どうでしょう。

DOBON.NET | プログラミング道 | プログラミング掲示板