using System; using System.Reflection; using System.Windows.Forms; using HarmonyLib; namespace PatchNumericUpDownPoC { internal static class HexadecimalNumericUpDownPatcher { private static readonly Harmony Harmony = new Harmony(nameof(HexadecimalNumericUpDownPatcher)); private static bool _isPatched; private static AccessTools.FieldRef _userEditRef; private static MethodInfo _mOriginal; private static MethodInfo _mPrefix; public static void DoPatch() { if (_isPatched) return; _mOriginal = AccessTools.Method(typeof(NumericUpDown), "ParseEditText"); if (null == _mOriginal) return; _mPrefix = SymbolExtensions.GetMethodInfo(() => Prefix(null)); _userEditRef = AccessTools.FieldRefAccess("userEdit"); Harmony.Patch(_mOriginal, new HarmonyMethod(_mPrefix)); _isPatched = true; } public static void UnPatch() { if (false == _isPatched) return; Harmony.Unpatch(_mOriginal, _mPrefix); } // ReSharper disable once InconsistentNaming private static bool Prefix(NumericUpDown __instance) { if (false == __instance.Hexadecimal) return true; try { var parsedValue = Convert.ToDecimal(Convert.ToUInt64(__instance.Text, 16)); if (parsedValue < __instance.Minimum) parsedValue = __instance.Minimum; if (parsedValue > __instance.Maximum) parsedValue = __instance.Maximum; __instance.Value = parsedValue; } catch { //Do nothing } finally { _userEditRef(__instance) = false; } return false; } } }