unity改变运行窗口的位置和大小

unity中好像没有这种方法,要用原生的方法,关键问题是要拿到窗体的句柄
如下所示,是我拿的别人的代码,找到的是没有父窗体的窗体句柄


    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;
        uint pid = (uint)Process.GetCurrentProcess().Id;  // 当前进程 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);    // 设置无错误
                    return false;   // 返回 false 以终止枚举窗口
                }
            }

            return true;

        }), pid);

        return (!bResult && Marshal.GetLastWin32Error() == 0) ? ptrWnd : IntPtr.Zero;
    }

拿到窗体的句柄之后,直接尽心设置

    [DllImport("user32.dll")]
    static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    const uint SWP_SHOWWINDOW = 0x0040;
    SetWindowPos(GetProcessWnd(), 0, StartX, StartY, ScreenWidth, ScreenHeight, SWP_SHOWWINDOW);
    原文作者:胜天半子_王二_王半仙
    原文地址: https://blog.csdn.net/qq_40666620/article/details/108005640
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞