SendMirCall.cs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using Mir2Assistant.Common.Models;
  2. using Mir2Assistant.Common.Utils;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Runtime.InteropServices;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace Mir2Assistant.Common.Functions
  10. {
  11. public class SendMirCall
  12. {
  13. [DllImport("user32.dll", SetLastError = true)]
  14. [return: MarshalAs(UnmanagedType.Bool)]
  15. static extern bool SendMessage(nint hwnd, uint msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
  16. [StructLayout(LayoutKind.Sequential)]
  17. struct COPYDATASTRUCT
  18. {
  19. public uint dwData;
  20. public int cbData;
  21. public IntPtr lpData;
  22. }
  23. public static void Send(MirGameInstanceModel gameInstance, nint code, byte[] data)
  24. {
  25. lock (gameInstance)
  26. {
  27. int size = data.Length * sizeof(byte);
  28. IntPtr unmanagedPointer = Marshal.AllocHGlobal(size);
  29. COPYDATASTRUCT cds;
  30. cds.dwData = (uint)code; // 自定义数据,可以是任何值
  31. cds.cbData = size;
  32. cds.lpData = unmanagedPointer;
  33. try
  34. {
  35. Marshal.Copy(data, 0, unmanagedPointer, data.Length);
  36. SendMessage(gameInstance.MirHwnd, 0x4a, 20250129, ref cds);
  37. }
  38. finally
  39. {
  40. Marshal.FreeHGlobal(unmanagedPointer);
  41. }
  42. }
  43. }
  44. public static void Send(MirGameInstanceModel gameInstance, nint code, nint[] data)
  45. {
  46. lock (gameInstance)
  47. {
  48. int size = data.Length * sizeof(int);
  49. IntPtr unmanagedPointer = Marshal.AllocHGlobal(size);
  50. COPYDATASTRUCT cds;
  51. cds.dwData = (uint)code; // 自定义数据,可以是任何值
  52. cds.cbData = size;
  53. cds.lpData = unmanagedPointer;
  54. try
  55. {
  56. Marshal.Copy(data, 0, unmanagedPointer, data.Length);
  57. SendMessage(gameInstance.MirHwnd, 0x4A, 20250129, ref cds);
  58. }
  59. finally
  60. {
  61. Marshal.FreeHGlobal(unmanagedPointer);
  62. }
  63. }
  64. }
  65. public static nint[] String2NIntArray(string p)
  66. {
  67. var l0 = p.Length % 4 + 4;
  68. var bytes = Encoding.GetEncoding("gb2312").GetBytes(p + new string('\0', l0));
  69. return Enumerable.Range(0, bytes.Length / 4)
  70. .Select(i => (nint)BitConverter.ToInt32(bytes, i * 4))
  71. .ToArray();
  72. }
  73. }
  74. }