| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- using Mir2Assistant.Common.Models;
- using Mir2Assistant.Common.Utils;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- namespace Mir2Assistant.Common.Functions
- {
- public class SendMirCall
- {
- [DllImport("user32.dll", SetLastError = true)]
- [return: MarshalAs(UnmanagedType.Bool)]
- static extern bool SendMessage(nint hwnd, uint msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
- [StructLayout(LayoutKind.Sequential)]
- struct COPYDATASTRUCT
- {
- public uint dwData;
- public int cbData;
- public IntPtr lpData;
- }
- public static void Send(MirGameInstanceModel gameInstance, nint code, byte[] data)
- {
- lock (gameInstance)
- {
- int size = data.Length * sizeof(byte);
- IntPtr unmanagedPointer = Marshal.AllocHGlobal(size);
- COPYDATASTRUCT cds;
- cds.dwData = (uint)code; // 自定义数据,可以是任何值
- cds.cbData = size;
- cds.lpData = unmanagedPointer;
- try
- {
- Marshal.Copy(data, 0, unmanagedPointer, data.Length);
- SendMessage(gameInstance.MirHwnd, 0x4a, 20250129, ref cds);
- }
- finally
- {
- Marshal.FreeHGlobal(unmanagedPointer);
- }
- }
- }
- public static void Send(MirGameInstanceModel gameInstance, nint code, nint[] data)
- {
- lock (gameInstance)
- {
- int size = data.Length * sizeof(int);
- IntPtr unmanagedPointer = Marshal.AllocHGlobal(size);
- COPYDATASTRUCT cds;
- cds.dwData = (uint)code; // 自定义数据,可以是任何值
- cds.cbData = size;
- cds.lpData = unmanagedPointer;
- try
- {
- Marshal.Copy(data, 0, unmanagedPointer, data.Length);
- SendMessage(gameInstance.MirHwnd, 0x4A, 20250129, ref cds);
- }
- finally
- {
- Marshal.FreeHGlobal(unmanagedPointer);
- }
- }
- }
- public static nint[] String2NIntArray(string p)
- {
- var l0 = p.Length % 4 + 4;
- var bytes = Encoding.GetEncoding("gb2312").GetBytes(p + new string('\0', l0));
- return Enumerable.Range(0, bytes.Length / 4)
- .Select(i => (nint)BitConverter.ToInt32(bytes, i * 4))
- .ToArray();
- }
- }
- }
|