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