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: 打包的时候不要勾选全屏