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); } }; } } } } } }