protected CustomShortcut FindShortcutNode(Control control)
        {
            var target = FindControlHelper
                         .FindControl(control, _shortcutMap);

            return(target != null
                                ? _shortcutMap[target.GetType()]
                                : null);
        }
        public bool ProcessMessageKey(Control control,
                                      Keys keys, ShortcutManager manager)
        {
            var methodName = FindShortcutMethod(keys);

            if (methodName == null)
            {
                return(Parent != null && Parent.ProcessMessageKey(control, keys, manager));
            }

            var mi = _owner.GetMethod(methodName, _bindingFlags);
            var ht = new Dictionary <Type, Control> {
                { OwnerType, control }
            };

            var target = FindControlHelper.FindControl(control, ht) ?? manager.MainForm;

            if (mi != null)
            {
                try
                {
                    mi.Invoke(target, null);
                }
                catch (Exception e)
                {
                    throw new ApplicationException(
                              "Произошла непредвиденная ошибка при обработке клавиатурного сообщения."
                              + Environment.NewLine
                              + "Возможно у вас повреждена БД или имеется ошибка в RSDN@Home",
                              e);
                    //MessageBox.Show(Form.ActiveForm,
                    //    "Произошла непредвиденная ошибка при обработке клавиатурного сообщения."
                    //    + Environment.NewLine
                    //    + "Возможно у вас повреждена БД или имеется ошибка в Янусе.",
                    //    "RSDN@Home");

                    //return false;
                }
            }

            return(true);
        }