1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 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<UpDownBase, bool> _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<UpDownBase, bool>("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;
- }
- }
- }
|