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

メインフォームのMenuStripで定義したショートカット

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

こんにちわ。

メインフォーム(アクティブではない)のメニューで登録したショートカット(Ctrl+Cなど)を、
生成した子ウィンドウ(MDIではない)でも有効にしたいのですが、
方法がよくわかりません。

ProcessCmdKey を使って色々やってみましたが、辿りつけていません。

メインメニューのみを持ったフォーム(MainForm)があるとして、
そのフォームから生成された別フォーム(SubForm)がアクティブという状態です。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=39063&forum=7

この質問と回答が、比較的お手本に近いのかな?と思ってはおりますが、
勘違いなのかうまくいっていません。

よろしくおねがいします。
■No32691に返信(納豆さんの記事)

VB.NET ソースですがこんなでどうでしょう?
インスタンス化の部分は既定のインスタンスを使っているので注意してください。

Form1:
  テストToolStripMenuItemにショートカット割り当てています

    Private Sub テストToolStripMenuItem_Click(sender As System.Object, e As System.EventArgs) Handles テストToolStripMenuItem.Click
        Label1.Text = Date.Now.ToString("yyyy/MM/dd HH:mm:ss")
    End Sub

    Public Function PubProcessCmdKey(ByRef msg As System.Windows.Forms.Message, keyData As System.Windows.Forms.Keys) As Boolean
        Dim newmsg = New Message()
        newmsg.HWnd = Me.Handle
        newmsg.LParam = msg.LParam
        newmsg.WParam = msg.WParam
        Return MyBase.ProcessCmdKey(newmsg, keyData)
    End Function

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Form2.Show()
    End Sub



Form2:
    Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, keyData As System.Windows.Forms.Keys) As Boolean
        Dim ret = Form1.PubProcessCmdKey(msg, keyData)
        If ret Then
            Return True
        Else
            Return MyBase.ProcessCmdKey(msg, keyData)
        End If
    End Function
■No32692に返信(shuさんの記事)

うまくいきました。ありがとうございます…。助かりました。
苦肉の策として、サブフォームにもメニューを作り、メインフォームのメソッドを呼んで
対処していましたが、これで美しくなります…。

Dim newmsg = New Message()
newmsg.HWnd = Me.Handle
newmsg.LParam = msg.LParam
newmsg.WParam = msg.WParam

このあたりのコードが、自分的には意味がよくわからないので、
調べてみようと思います。
ありがとうございました!
解決済み!

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