|
2010/01/23(Sat) 13:59:19 編集(投稿者)
情報不足という現状なので、最初から整理させていただきます。
クラス構成: 基底クラスと派生クラス(各業務画面)があります。 業務画面が起動される時に、基底クラスは各コントロールに対して、フォント、サイズ等の設定を行います。
現在の対策: Enterキーを押し続けると、click→click→click→・・・→KeyUpの順で発生します。 これを防ぐために、基底クラスがボタンのデザインを設定するとこで、各ボタンにPreviewKeyDownとKeyUPのイベントハンドルを追加しました。
// PreviewKeyDownハンドル Private Sub PreviewKeyDownHandler(VaVal sender As Object, ByVal e As System.Windows.Form.KeyEventArgs) _ Handles button1.PreviewKeyDown If e.KeyData = Keys.Enter Then e.IsInputKey = True End End Sub
// Keyupハンドル Private KeyUpHandler(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) _ Handles button1.KeyUp If e.KeyData = Keys.Enter Then button1.PerformClick() End If End Sub
これの実装により, Enterキーを押し続けると、PreviewKeyDown→KeyDown→KeyPress→ PreviewKeyDown→KeyDown→KeyPress→ ・・・→KeyUp(離した時) になり、Enterキーによるボタンがクリックされるデフォルト動作はなくなり、KeyUpでクリックイベント発生させています。 -------------------------------------------------------------------------------------------------------- 上記で、Enterキー押しっぱなしによる、Clickイベントの連続発生を防いでいます。
問題1: メニューから画面Aを起動しました。 この時、画面A.ボタンAにフォーカスがあるように見える(GOOGLE.co.jpを開いた時の、検索ボタンの状態、またはボタンの周りに点線がない状態)が、 Enterキーを押したら、PreviewKeyDown、KeyDown、KeyPress、KeyUpが発生しないまま、クリックイベントが発生します。 (画面Aが起動されて、マウスでボタンAにちゃんとフォーカスを当ててからEnterキーを押すと、正しい動きをします。)
問題2: 画面Aから画面Bを起動しました。 画面Bが起動されると、画面B.閉じるボタンにフォーカスがあるように見える(GOOGLE.co.jpを開いた時の、検索ボタンの状態、またはボタンの周りに点線がない状態)。 この時、Enterキーを押すと、画面が閉じられ、Enterキーを離すと画面Bが起動される(画面A.ボタンAにフォーカスがあり、KeyUpが発生したため)。
根本的に、問題1と2も一緒だと思いますね。 なぜボタンがそのような状態になり、Enterキーによりクリックイベントが発生するんでしょうか?
|