HexadecimalNumericUpDownPatcher.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System;
  2. using System.Reflection;
  3. using System.Windows.Forms;
  4. using HarmonyLib;
  5. namespace PatchNumericUpDownPoC
  6. {
  7. internal static class HexadecimalNumericUpDownPatcher
  8. {
  9. private static readonly Harmony Harmony = new Harmony(nameof(HexadecimalNumericUpDownPatcher));
  10. private static bool _isPatched;
  11. private static AccessTools.FieldRef<UpDownBase, bool> _userEditRef;
  12. private static MethodInfo _mOriginal;
  13. private static MethodInfo _mPrefix;
  14. public static void DoPatch()
  15. {
  16. if (_isPatched) return;
  17. _mOriginal = AccessTools.Method(typeof(NumericUpDown), "ParseEditText");
  18. if (null == _mOriginal) return;
  19. _mPrefix = SymbolExtensions.GetMethodInfo(() => Prefix(null));
  20. _userEditRef = AccessTools.FieldRefAccess<UpDownBase, bool>("userEdit");
  21. Harmony.Patch(_mOriginal, new HarmonyMethod(_mPrefix));
  22. _isPatched = true;
  23. }
  24. public static void UnPatch()
  25. {
  26. if (false == _isPatched) return;
  27. Harmony.Unpatch(_mOriginal, _mPrefix);
  28. }
  29. // ReSharper disable once InconsistentNaming
  30. private static bool Prefix(NumericUpDown __instance)
  31. {
  32. if (false == __instance.Hexadecimal) return true;
  33. try
  34. {
  35. var parsedValue = Convert.ToDecimal(Convert.ToUInt64(__instance.Text, 16));
  36. if (parsedValue < __instance.Minimum)
  37. parsedValue = __instance.Minimum;
  38. if (parsedValue > __instance.Maximum)
  39. parsedValue = __instance.Maximum;
  40. __instance.Value = parsedValue;
  41. }
  42. catch
  43. {
  44. //Do nothing
  45. }
  46. finally
  47. {
  48. _userEditRef(__instance) = false;
  49. }
  50. return false;
  51. }
  52. }
  53. }