コンボボックス のディフォルトのショートカットキー (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 は、こちらをご覧ください。
このサイトのページへのリンクは自由に行っていただいてかまいません。
このサイトで公開している全ての画像、プログラム、文書の無断転載を禁止します。
ここをクリック
すると表示されるページから作者へメールで連絡できます。