Windows7
Visual studio 2010
framework 4
フォームにボタンを1つ貼り、
Form1のkeypreview=true
F10キーPerformClickでボタン押下すると、
1回目のメッセージボックスは「OK」ボタンにフォーカスがあたっていて、
「Enter」キーで閉じることが可能ですが、
そのまま、もう一度「F10」キーでメッセージボックスを出力すると、
「OK」ボタンにフォーカスがあたっておらず、メッセージフォームのメニューが出てしまい、
操作性が非常に悪いです。
PerformClickは通常のクリックイベントと同様の動作をすると思っていたので残念です
2回目のメッセージボックスでもきちんと「OK」ボタンにフォーカスが当たる方法はないでしょうか?
操作性が悪くてキーボードだけで操作する人に申し訳ないです
以下、使用したコードです。
Public Class Form1
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
MessageBox.Show("F10ボタンを押しました", "確認", MessageBoxButtons.OK)
Me.Focus()
End Sub
Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
If e.KeyCode = Keys.F10 Then
Button1.PerformClick()
End If
End Sub
End Class
> PerformClickは通常のクリックイベントと同様の動作をすると思っていたので残念です
PerformClick の問題というよりも、KeyDown から KeyUp までの処理の流れの中で、
それらを阻害するような処理を割り込ませたことが原因ではないでしょうか。
そもそもメッセージボックスが表示されているときに
F10(またはAlt) → Enter(またはSpaceあるいは矢印など) の
キー操作が行われると場合、そのような状態になりますよね。
それ自体はメニュー操作のためのキー操作ですが、
メッセージボックスにはアプリケーションメニューが無いので、
直接「システムメニュー」が表示される、というわけで。
> 2回目のメッセージボックスでもきちんと「OK」ボタンにフォーカスが当たる方法はないでしょうか?
キー操作の途中で割り込ませたが故の問題であるとすれば、
キー操作が終わった後—すなわち KeyUp —で処理されては如何でしょうか。
そうすれば、システムメニューも出なくなると思います。……多分。
KeyUp だと都合が悪いのであれば、KeyDown 内の処理で、
If e.KeyCode = Keys.F10 Then
e.Handled = True
'Application.DoEvents()
Button1.PerformClick()
End If
のように、「.Handled = True」を加えてみてください。これにより、
イベントがユーザー処理されたことが伝わるので、既定の動作が
抑制されることが期待されます。駄目なら DoEvents 連携で。
(以下蛇足)
> きちんと「OK」ボタンにフォーカスが当たる方法はないでしょうか?
上記が、コントロールをアクティブにするという意味にとどまらず、
さらに加えて、フォーカス枠の破線も表示させたいという意味であれば、
マウス操作ではなく、キーボード操作で画面を表示する必要があります。
もし、マウス操作でもフォーカス枠を表示させたい場合には、
OS側の[コンピューターの簡単操作センター]のキーボード設定で、
「ショートカットキーとアクセスキーに下線を表示」を有効にすることになります。
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=31200&no=0&KLOG=5
>魔界の仮面弁士様
いつも素早い回答ありがとうございます!
e.Handled = True
を追加するだけで、理想通りの動きになりました!
ちなみに、KeyUpイベントでも想定の動きになりましが、
イベントを変えるのに抵抗がありましたので、KeyDownイベントのままにします。
どうもありがとうございました!