c# コンボボックスのショートカットキー実行タイミング

コンボボックス のディフォルトのショートカットキー (Ctrl+V 等) に対応する処理は、OnKeyDown よりも後に行われます。おそらく、ネイティブのウィンドウプロシージャー内で処理されているものと思われます。

OnKeyDown の実行タイミングは、PreProcessMessage よりも遅く、ProcessCmdKey や、 ProcessDialogKey で、true を返した場合には、ディフォルトの処理が実行されません。

Ctrl+V などのキーを、コンボボックスにフォーカスがある場合にはディフォルトの挙動を、無い場合にはショートカットキーとして別の挙動を行わせる方法は、c# ショートカットキーを正しく処理するには? をご覧ください。

実験の詳細

Ctrl+X で選択している文字列をカットした場合、OnKeyDown よりも後に、OnTextChanged が発生することを確認します。

出力結果 (大事な部分を抜粋)

OnKeyDown: ControlKey, Control
OnKeyDown: X, Control
OnTextChanged !

ソースコード

using System;
using System.Windows.Forms;

namespace UnitTest
{
  class TestComboBoxShortcutKeys : Tester
  {
    class ComboBoxTestComboBoxShortcutKeys : ComboBox
    {
      protected override void OnTextChanged(EventArgs e)
      {
        Console.WriteLine("OnTextChanged !");
        base.OnTextChanged(e);
      }
      
      protected override void OnKeyDown(KeyEventArgs e)
      {
        Console.WriteLine("OnKeyDown: " + e.KeyData);
        // base.OnKeyDown(e);
      }
    }

    class FormTestComboBoxShortcutKeys : Form
    {
      public FormTestComboBoxShortcutKeys()
      {
        // comboBoxTest = new ComboBox();
        comboBoxTest = new ComboBoxTestComboBoxShortcutKeys();

        // レイアウト停止 //

        SuspendLayout();

        // メニュー //

        var rect = ClientRectangle;
        comboBoxTest.Location = rect.Location;
        comboBoxTest.Name = "comboBoxTest";
        comboBoxTest.Size = new System.Drawing.Size(rect.Width, 20);
        comboBoxTest.TabIndex = 0;

        // フォーム //

        Controls.Add(comboBoxTest);
        MaximizeBox = false;
        FormBorderStyle = FormBorderStyle.FixedSingle;

        // レイアウト //

        ResumeLayout(false);
        PerformLayout();
      }

      protected ComboBox comboBoxTest;
    }

    public override void Test()
    {
      Application.Run(new FormTestComboBoxShortcutKeys());
    }
  }
}

コンソールアプリケーションの Main() から、Test() を呼んで実行します。コードのほんどの部分は、単にコンボボックスの派生クラスを作成しているだけです。スタックトレースを出力している SSS.DebugUtil.CallStackLines は、こちらをご覧ください。

となりのページ

このサイトについて

このサイトのページへのリンクは自由に行っていただいてかまいません。
このサイトで公開している全ての画像、プログラム、文書の無断転載を禁止します。

連絡先

ここをクリック すると表示されるページから作者へメールで連絡できます。

共有