teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

表現の修正

2020/06/11 09:02

投稿

kenshirou
kenshirou

スコア772

answer CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  KeyDownイベントは、そのままではエスケープキーを捕捉できません。
5
5
  PreviewKeyDownイベントではエスケープキーを捕捉できるのですが、フォーム上にコントロールがあると、フォームまでPreviewKeyDownイベントが発生しません。
6
- ただし、フォームのKeyPreviewプロパティをTrueにすると、フォームのKeyDownイベントでEscapeキーを捕捉できるようになります。
6
+ この場合、フォームのKeyPreviewプロパティをTrueにすると、フォームのKeyDownイベントでEscapeキーを捕捉できるようになります。
7
7
 
8
8
  ただし、キーによっては上記方法で捕捉できないものがあります。(矢印等)
9
9
  そのようなキーを捕捉したい場合は、以下の記事を参考にして、フォームで対象キーを捕捉できるようになります。

2

情報の追記

2020/06/11 09:01

投稿

kenshirou
kenshirou

スコア772

answer CHANGED
@@ -3,13 +3,15 @@
3
3
 
4
4
  KeyDownイベントは、そのままではエスケープキーを捕捉できません。
5
5
  PreviewKeyDownイベントではエスケープキーを捕捉できるのですが、フォーム上にコントロールがあると、フォームまでPreviewKeyDownイベントが発生しません。
6
- そこで以下記事参考して、フォームでエスケープキーを捕捉できるようにしてはどうでしょうか
6
+ ただしフォームKeyPreviewプロパティTrueすると、フォームのKeyDownイベントEscapeキーを捕捉できるようになります
7
7
 
8
+ ただし、キーによっては上記方法で捕捉できないものがあります。(矢印等)
9
+ そのようなキーを捕捉したい場合は、以下の記事を参考にして、フォームで対象キーを捕捉できるようになります。
10
+
8
11
  [(参考)Buttonコントロールにフォーカスがあるとフォームで矢印キーのキーイベントが発生しない
9
12
  ](https://dobon.net/vb/dotnet/form/keypreview2.html)
10
13
 
11
- 私も以下のコードをフォーム内のコードに貼り付けたら、エスケープキーで画面が閉じるようになりました。
12
- (その代わり元々のエスケープキーの機能はフォーム上で完全失われます。
14
+ 参考までにこれにエスケープキーを適用すると以下ようなります。
13
15
 
14
16
  ```VB
15
17
  <System.Security.Permissions.UIPermission( _

1

補足を追加

2020/06/11 09:00

投稿

kenshirou
kenshirou

スコア772

answer CHANGED
@@ -1,6 +1,28 @@
1
+ ※フォームがShowDialogで開いていないことを前提とします。
2
+ (この場合はCancelButtonプロパティの設定でエスケープキーでフォームを閉じることが可能。)
3
+
1
4
  KeyDownイベントは、そのままではエスケープキーを捕捉できません。
2
5
  PreviewKeyDownイベントではエスケープキーを捕捉できるのですが、フォーム上にコントロールがあると、フォームまでPreviewKeyDownイベントが発生しません。
3
6
  そこで、以下の記事を参考にして、フォームでエスケープキーを捕捉できるようにしてはどうでしょうか。
4
7
 
5
8
  [(参考)Buttonコントロールにフォーカスがあるとフォームで矢印キーのキーイベントが発生しない
6
- ](https://dobon.net/vb/dotnet/form/keypreview2.html)
9
+ ](https://dobon.net/vb/dotnet/form/keypreview2.html)
10
+
11
+ 私も以下のコードをフォーム内のコードに貼り付けたら、エスケープキーで画面が閉じるようになりました。
12
+ (その代わり、元々のエスケープキーの機能は、このフォーム上で完全に失われます。)
13
+
14
+ ```VB
15
+ <System.Security.Permissions.UIPermission( _
16
+ System.Security.Permissions.SecurityAction.Demand, _
17
+ Window:=System.Security.Permissions.UIPermissionWindow.AllWindows)> _
18
+ Protected Overrides Function ProcessDialogKey( _
19
+ ByVal keyData As Keys) As Boolean
20
+ If (keyData And Keys.KeyCode) = Keys.Escape Then
21
+ Me.Close()
22
+ 'Escapeキーの本来の処理をさせたくないときは、trueを返す
23
+ Return True
24
+ End If
25
+
26
+ Return MyBase.ProcessDialogKey(keyData)
27
+ End Function
28
+ ```