using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.InteropServices; using UnityEngine; public class HandleManager { public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam); [DllImport("user32.dll", SetLastError = true)] public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr GetParent(IntPtr hWnd); [DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId); [DllImport("kernel32.dll")] public static extern void SetLastError(uint dwErrCode); public static IntPtr GetProcessWnd() { IntPtr ptrWnd = IntPtr.Zero; // 当前进程 ID uint pid = (uint)Process.GetCurrentProcess().Id; bool bResult = EnumWindows(new WNDENUMPROC(delegate (IntPtr hwnd, uint lParam) { uint id = 0; if (GetParent(hwnd) == IntPtr.Zero) { GetWindowThreadProcessId(hwnd, ref id); // 找到进程对应的主窗口句柄 if (id == lParam) { // 把句柄缓存起来 ptrWnd = hwnd; // 设置无错误 SetLastError(0); // 返回 false 以终止枚举窗口 return false; } } return true; }), pid); return (!bResult && Marshal.GetLastWin32Error() == 0) ? ptrWnd : IntPtr.Zero; } }