C#のメニューでShift+Enterを取得したい


お世話になっております。  
C#のContextMenuStripでShift+Enterを検出したいのですが、うまくいきません。  
具体的にはクリックされた時のイベントでWindowsAPIのGetKeyStateでShiftキーの状態を取得しているんですが、そもそもShift+Enterではクリックしたときのイベントが起きないようです。  
ちなみに、Shiftキーを押しながら、普通にマウスで左クリックしたときはうまくいくようです。  
何か方法はあるでしょうか。  
以上、よろしくお願いします。




'Shift' の状態だけを取るなら `Control.ModifierKeys.HasFlag(Keys.Shift)` で取れます。

例

[code]

            private void timer1_Tick(object sender, EventArgs e)
            {
                if (Control.ModifierKeys.HasFlag(Keys.Shift))
                {
                    this.label1.Text = "Shift ON";
                } 
                else
                {
                    this.label1.Text = "Shift OFF";
                }
            }
    
[/code]

> そもそもShift+Enterではクリックしたときのイベントが起きないようです。

あ、こっちのほうが問題だったんですね。  
contextMenuStrip1 PrevKeyDown イベント の中で キーを判定して SHIFT + RETURN の場合に  
選択されている メニューを呼び出すようにコーディングしてみました。

[code]

    this.contextMenuStrip1.PreviewKeyDown += 
    new System.Windows.Forms.PreviewKeyDownEventHandler(this.contextMenuStrip1_PreviewKeyDown);
    
[/code]

[code]

    private void contextMenuStrip1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyData.HasFlag(Keys.Shift)
            && e.KeyData.HasFlag(Keys.Return))
        {
            var cMenu = sender as ContextMenuStrip;
            if (cMenu != null)
            {
                var selectItem = cMenu.Items.Cast<ToolStripMenuItem>()
                        .Where(r => r.Selected == true).FirstOrDefault();
    
                selectItem?.PerformClick();
            }
        }
    }
    
[/code]

それっぽく動作すると思います。




'Shift' の状態だけを取るなら `Control.ModifierKeys.HasFlag(Keys.Shift)` で取れます。

例

[code]

            private void timer1_Tick(object sender, EventArgs e)
            {
                if (Control.ModifierKeys.HasFlag(Keys.Shift))
                {
                    this.label1.Text = "Shift ON";
                } 
                else
                {
                    this.label1.Text = "Shift OFF";
                }
            }
    
[/code]

> そもそもShift+Enterではクリックしたときのイベントが起きないようです。

あ、こっちのほうが問題だったんですね。  
contextMenuStrip1 PrevKeyDown イベント の中で キーを判定して SHIFT + RETURN の場合に  
選択されている メニューを呼び出すようにコーディングしてみました。

[code]

    this.contextMenuStrip1.PreviewKeyDown += 
    new System.Windows.Forms.PreviewKeyDownEventHandler(this.contextMenuStrip1_PreviewKeyDown);
    
[/code]

[code]

    private void contextMenuStrip1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyData.HasFlag(Keys.Shift)
            && e.KeyData.HasFlag(Keys.Return))
        {
            var cMenu = sender as ContextMenuStrip;
            if (cMenu != null)
            {
                var selectItem = cMenu.Items.Cast<ToolStripMenuItem>()
                        .Where(r => r.Selected == true).FirstOrDefault();
    
                selectItem?.PerformClick();
            }
        }
    }
    
[/code]

それっぽく動作すると思います。

