none
ProcessCmdKeyの使い方 RRS feed

  • 質問

  • お世話になります

    vb2008で開発いていまして

    form1のボタンからform2を表示しF12キーを押すと

    form1に戻るプログラムを作っています、そこで

    ProcessCmdKeyを使ってform2をcloseしたいと考えております

    現象としましてはform2を終了したと同時にform1も終了してしまいます

    原因はform2より戻った時にform1のKeyUpイベントがはたらいてしまっているのが確認できました

    ProcessCmdKeyというのは親フォームにまで影響してしまいます、msgboxを表示すると現象が回避されるのですが

    f12押した後のenterは面倒です、ProcessCmdKeyを何とか使って解決できないでしょうか

    尚、Form2_KeyUpのコメントを外すと思った動きになります

    vb2008も初心者で、質問するのも恥ずかしいレベルですが、ご教授いただけると助かります、よろしくお願いします

    Public Class Form1
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.KeyPreview = True
        End Sub
    
        Private Sub Form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
            If e.KeyCode = Windows.Forms.Keys.F12 Then
                Me.Close()
            End If
        End Sub
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim Form2 As New Form2
            Form2.ShowDialog()
            Form2.Dispose()
        End Sub
    End Class
    
    Public Class Form2
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.KeyPreview = True
        End Sub
    
        'Private Sub Form2_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp
        '    If e.KeyCode = Windows.Forms.Keys.F12 Then
        '        Me.Close()
        '    End If
        'End Sub
    
        Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
            If keyData = Keys.F12 Then
                'MsgBox("test")
                Me.Close()
                Return True
            End If
    
            Return MyBase.ProcessCmdKey(msg, keyData)
        End Function
    End Class

    2014年8月25日 8:12

回答

  • 返信ありがとうございます

    上記のコードをform2に貼り付けてform2でf12を押しても、現象は変わりませんでした

    Me.Controls.Clear()のコメントを外した所、メーカより購入した帳票プレビューツール(COMコンポーネント)が消えましたが

    form2は閉じませんでした、やはりF12で終了したいと、自分の要求している事が難しいんでしょうか

    F12を離すことでKeyUpが発生するためにForm1が閉じられてしまうんですね、その辺から解決策があればと思うんのですが

    ご教授お願いします。

    • 回答としてマーク ジョウジ 2017年7月2日 23:49
    2014年8月26日 7:26
  • 少し時間がたったスレッドですが…

    F12キーで終了したいだけであれば、

    1. Form1でもProcessCmdKeyで終了するようにする。
    2. KeyUpではなくKeyDownで終了するようにする。

    でどうでしょうか。

    • 回答としてマーク ジョウジ 2017年7月2日 23:49
    2015年1月13日 12:20
    モデレータ

すべての返信

  • // F12はデバッガへの切り替えでしたっけ。

    ProcessCmdKeyはTrueを返すだけにとどめ、KeyUpでCloseするようにすれば良いのではないでしょうか。

    2014年8月25日 9:01
  • 回答ありがとうございます

    説明が足りなくてすいません

    Form2にはメーカより購入した帳票プレビューツール(COMコンポーネント)が貼り付けてあり

    Me.KeyPreview=trueにしても

    KyUpでキーイベントが拾えないのです、調べに調べたどり着いたのがProcessCmdKeyなのです

    別の方法でもいいのでヒントになる事であれば回答いただきたいです。

    2014年8月25日 9:24
  • ProcessCmdKeyが親Formに影響するのではなく、Form2が閉じられるとForm1がアクティブになりフォーカスが移動します。
    その時にF12が押された状態になっているので、Form1でKeyDownが発生し、さらにF12を離すことでKeyUpが発生するためにForm1が閉じられてしまいます。

    Form2に配置されているコントロールがKeyUpをHandled=trueにしてしまってForm2_KeyUpに到達できないのであれば、そのコントロールがKeyUpを処理しないようにしてやれば良いということになります。
    簡単にやるならば、Form2のEnableをFalseにしてやることで対応できると思います。

    Public Class Form2
        Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.KeyPreview = True
        End Sub
    
        Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
            If keyData = Keys.F12 Then
                Me.Enabled = False
                'Me.Controls.Clear() 'Me.Enable=Falseでも処理されてしまう場合はControlを全部消してしまう
                Return True
            End If
    
            Return MyBase.ProcessCmdKey(msg, keyData)
        End Function
    
        Private Sub Form2_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
            If e.KeyCode = Windows.Forms.Keys.F12 Then
                Me.Close()
            End If
        End Sub
    End Class


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2014年8月25日 15:22
  • 返信ありがとうございます

    上記のコードをform2に貼り付けてform2でf12を押しても、現象は変わりませんでした

    Me.Controls.Clear()のコメントを外した所、メーカより購入した帳票プレビューツール(COMコンポーネント)が消えましたが

    form2は閉じませんでした、やはりF12で終了したいと、自分の要求している事が難しいんでしょうか

    F12を離すことでKeyUpが発生するためにForm1が閉じられてしまうんですね、その辺から解決策があればと思うんのですが

    ご教授お願いします。

    • 回答としてマーク ジョウジ 2017年7月2日 23:49
    2014年8月26日 7:26
  • 少し時間がたったスレッドですが…

    F12キーで終了したいだけであれば、

    1. Form1でもProcessCmdKeyで終了するようにする。
    2. KeyUpではなくKeyDownで終了するようにする。

    でどうでしょうか。

    • 回答としてマーク ジョウジ 2017年7月2日 23:49
    2015年1月13日 12:20
    モデレータ