I have a trick.
UcBase inherits from UesrControl
UcSub1 and UcSub2 inherit from UcBase. UcSuperClass also inherits from UcBase.
UcSub1, UcSub2 is used in UcSuperClass.
I am madly UcSub1 and UcSub2 are calling ProcessCmdKey normally.
my codes were
public class UcBase : UserControl { public delegate bool ProcessCmdKeyHandler(Keys keyData); public ProcessCmdKeyHandler KeyHandler; protected override void OnLoad(EventArgs e) { base.OnLoad(e); KeyHandler += ProcessKey; if (Parent != null) { var parent = GetParentControl<UcBase>(Parent); if (parent != null) { parent.KeyHandler += ProcessKey; } } } protected virtual bool ProcessKey(Keys keyData) { return false; } protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { const int WM_KEYDOWN = 0x100; const int WM_SYSKEYDOWN = 0x104; if (KeyHandler != null && (msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN)) { if (KeyHandler(keyData) == true) { return true; } } return base.ProcessCmdKey(ref msg, keyData); } private T GetParentControl<T>(Control control) where T : Control { T parentControl = default(T); var queue = new Queue<Control>(); var targetControlType = typeof(T); queue.Enqueue(control.Parent); while (queue.Count > 0) { var parent = queue.Dequeue(); if (parent != null) { if (parent.GetType().BaseType == targetControlType) { parentControl = (T)parent; break; } else { queue.Enqueue(parent.Parent); } } else { break; } } return parentControl; } } public class UcSub1 : UcBase { protected override bool ProcessKey(Keys keyData) {
Kim Ki Won
source share