Пример #1
0
        private static void ApplyKeeResizeHack(EditAutoTypeItemForm editForm, int shiftAmount)
        {
            // KeeResize hack - KeeResize will automatically grow the items on the form when it resizes, which doesn't play nicely with having them moved from their original locations.
            // To fix this, intercept the resize event for KeeResize and lie about the size of the form.
            var eventsProperty = editForm.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);

            if (eventsProperty != null)
            {
                var events = eventsProperty.GetValue(editForm, null) as EventHandlerList;

                var resizeEventKeyField = typeof(Control).GetField("EventResize", BindingFlags.NonPublic | BindingFlags.Static);
                if (resizeEventKeyField != null)
                {
                    var resizeEventKey = resizeEventKeyField.GetValue(editForm);

                    var resizeEvent = events[resizeEventKey];

                    if (resizeEvent != null)
                    {
                        var keeResizeEventHandler = resizeEvent.GetInvocationList().FirstOrDefault(eventHandler => eventHandler.Method.DeclaringType.FullName == "KeeResizeLib.FormResizer");
                        if (keeResizeEventHandler != null)
                        {
                            events.RemoveHandler(resizeEventKey, keeResizeEventHandler);

                            var heightField = typeof(Control).GetField("height", BindingFlags.NonPublic | BindingFlags.Instance);

                            if (heightField != null)
                            {
                                // Discover minimum height
                                var controlInfoField = keeResizeEventHandler.Target.GetType().GetField("ControlInfo", BindingFlags.Public | BindingFlags.Instance);
                                if (controlInfoField != null)
                                {
                                    var controlInfo = controlInfoField.GetValue(keeResizeEventHandler.Target);
                                    if (controlInfo != null)
                                    {
                                        var orgHField = controlInfo.GetType().GetField("OrgH", BindingFlags.Public | BindingFlags.Instance);
                                        if (orgHField != null)
                                        {
                                            var orgH = orgHField.GetValue(controlInfo) as int?;
                                            if (orgH != null)
                                            {
                                                // Enforce this as a minimum size
                                                editForm.MinimumSize = new Size(Math.Max(editForm.MinimumSize.Height, orgH.Value), editForm.MinimumSize.Width);
                                            }
                                        }
                                    }
                                }

                                // Intercept all future resizes to lie about the height to KeeResize
                                editForm.Resize += (o, e) =>
                                {
                                    var realHeight = (int)heightField.GetValue(editForm);
                                    heightField.SetValue(editForm, realHeight - shiftAmount);

                                    try
                                    {
                                        keeResizeEventHandler.DynamicInvoke(o, e);
                                    }
                                    finally
                                    {
                                        heightField.SetValue(editForm, realHeight);
                                    }
                                };
                            }
                        }
                    }
                }
            }
        }