using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Runtime.InteropServices;

public class FixResolution 
{
    static FixResolution instance;
    public static FixResolution Instance
    {
        get
        {
            if (instance == null)
                instance = new FixResolution();
            return instance;
        }
    }


    /// <summary>
    /// _nIndex 详情
    /// </summary>
    const Int32 GWL_EXSTYLE = -20;//设定一个新的扩展风格
    const Int32 GWL_HINSTANCE = -6;//设置一个新的应用程序实例句
    const Int32 GWL_ID = -12;//设置一个新的窗口标识符
    const Int32 GWL_STYLE = -16;//设定一个新的窗口风格
    const Int32 GWL_USERDATA = -21;//设置与窗口有关的32位值。每个窗口均有一个由创建该窗口的应用程序使用的32位值
    const Int32 GWL_WNDPROC = -4;//为窗口设定一个新的处理函数
    const Int32 GWL_HWNDPARENT = -8;//改变子窗口的父窗口,应使用SetParent函数
    const Int32 DWL_DLGPROC = 4;//设置对话框过程的新地址
    const Int32 DWL_MSGRESULT = 0;//设置在对话框过程中处理的消息的返回值
    const Int32 DWL_USER = 8;//设置的应用程序私有的新的额外信息,例如一个句柄或指针


    /// <summary>
    /// dwNewLong 详情-------列表控件的专用风格 一般就写一个数字1吧  其他的我也不知道常量数是多少---没查出来
    /// </summary>
    const UInt32 LVS_ICON = 0;//大图标显示
    const UInt32 LVS_SMALLICON = 0;//小图标显示
    const UInt32 LVS_LIST = 0;//列表显示
    const UInt32 LVS_REPORT = 0;//详细报表显示
    const UInt32 LVS_EDITLABELS = 0;//结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列
    const UInt32 LVS_SHOWSELALWAYS = 0;//在失去焦点时也显示当前选中的结点
    const UInt32 LVS_SINGLESEL = 0;//同时只能选中列表中一项


    /// <summary>
    /// uFlags 详情
    /// </summary>
    const UInt32 SWP_NOMOVE = 0x0002;//保持当前的位置(忽略x和y参数)
    const UInt32 SWP_NOZORDER = 0x0004;//保持当前的次序(忽略pWndInsertAfter)
    const UInt32 SWP_NOREDRAW = 0x0008;//不重画变化。如果设置了这个标志,则不发生任何种类的变化。这适用于客户区、非客户区(包括标题和滚动条)以及被移动窗口覆盖的父窗口的任何部分。当这个标志被设置的时候,应用程序必须明确地无效或重画要重画的窗口和父窗口的任何部分。
    const UInt32 SWP_NOACTIVATE = 0x0010;//不激活窗口。如果没有设置这个标志,则窗口将被激活并移动到顶层或非顶层窗口组(依赖于pWndInsertAfter参数的设置)的顶部。
    const UInt32 SWP_FRAMECHANGED = 0x0020;//向窗口发送一条WM_NCCALCSIZE消息,即使窗口的大小不会改变。如果没有指定这个标志,则仅当窗口的大小发生变化时才发送WM_NCCALCSIZE消息。
    const UInt32 SWP_SHOWWINDOW = 0x0040;//显示窗口
    const UInt32 SWP_HIDEWINDOW = 0x0080;//隐藏窗口
    const UInt32 SWP_NOCOPYBITS = 0x0100;//废弃这个客户区的内容。如果没有指定这个参数,则客户区的有效内容将被保存,并在窗口的大小或位置改变以后被拷贝回客户区
    const UInt32 SWP_NOOWNERZORDER = 0x0200;//不改变拥有者窗口在Z轴次序上的位置
    const UInt32 SWP_NOSENDCHANGING = 0x0400;//防止窗口接收WM_WINDOWPOSCHANGING消息

    [DllImport("user32.dll")]
    static extern IntPtr SetWindowLong(IntPtr hwnd, int _nIndex, int dwNewLong);

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

    [DllImport("user32.dll")]
    static extern IntPtr GetActiveWindow();//表示获取它现在打开的windows窗体

    public void Init(int m_x, int m_y)
    {
        // Screen.SetResolution(400, 400, false);  unity自带的强制设置分辨率的函数

        //下面这俩是利用win32设置的改变起始位置和分辨率的函数
        //第一个是设置深度和长度的。通俗的讲就是有无边框
        //第二个是设置位置和分辨率的(参数为-1后面开始的那位,一共四位,前两位起始坐标位置,然后后两位是分辨率)

        SetWindowLong(GetActiveWindow(), -16, 1);
        SetWindowPos(GetActiveWindow(), -1, 0, 0, m_x, m_y, SWP_SHOWWINDOW);//SWP_SHOWWINDOW
    }




    /// <summary>
    /// 置底
    /// </summary>
    void button1()
    {
        SetWindowPos(GetActiveWindow(), -1, 0, 0, 1920, 1080, SWP_SHOWWINDOW);//SWP_SHOWWINDOW
    }

    /// <summary>
    /// 置顶
    /// </summary>
    void button2()
    {
        SetWindowPos(GetActiveWindow(), 1, 0, 0, 1920, 1080, SWP_SHOWWINDOW);//SWP_SHOWWINDOW
    }

}

 

 PS: 打包的时候不要勾选全屏