Unity发布exe去窗口设置分辨率

前段时间做游戏pc端,要求exe运行去窗口,还要固定分辨率
unity有设置分辨率的API:Screen.SetResolution
但是使用这个会跟win32 api冲突
为了去窗口只有全部使用win32 api
使用win32 api必须先定义,有点像使用c++ dll一样

    [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);

API很多,具体的可以到https://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspx查询


去边框

    //SetWindowLong参数
    public const int GWL_EXSTYLE= -20; //获得扩展窗口风格。
    public const int GWL_HINSTANCE = -6; //获得应用实例的句柄。。
    public const int GWL_HWNDPARENT = -8; //如果父窗口存在,获得父窗口句柄。
    public const int GWL_ID = -12; //获得窗口标识。
    public const int GWL_STYLE = -16; //获得窗口风格。
    public const int GWL_USERDATA = -21; //获得与窗口有关的32位值。每一个窗口均有一个由创建该窗口的应用程序使用的32位值。。
    public const int GWL_WNDPROC = -4; //获得窗口过程的地址,或代表窗口过程的地址的句柄。必须使用CallWindowProc函数调用窗口过程。

    //window style参数
    public const int WS_BORDER = 1;  //The window has a thin-line border.
    public const int WS_POPUP = 0x800000;   //The windows is a pop-up window. This style cannot be used with the WS_CHILD style.

    public static IntPtr DisableWindowBorder(IntPtr hwnd)
    {
        if (!CheckPlatform())
            return IntPtr.Zero;
        return SetWindowLong(hwnd, GWL_STYLE, WS_POPUP);
    }

设置分辨率和窗口位置

    //ShowWindow参数
    public const int SW_FORCEMINIMIZE = 11; //在WindowNT5.0中最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数。
    public const int SW_HIDE = 0;  //隐藏窗口并激活其他窗口
    public const int SW_MAXIMIZE = 3;  //最大化指定的窗口
    public const int SW_MINIMIZE = 6;   //最小化指定的窗口并且激活在Z序中的下一个顶层窗口。
    public const int SW_RESTORE = 9;   //激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志。
    public const int SW_SHOW = 5;  //在窗口原来的位置以原来的尺寸激活和显示窗口
    public const int SW_SHOWDEFAULT = 10;   //依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的。nCmdShow=10。
    public const int SW_SHOWMAXIMIZED = 3; //激活窗口并将其最大化。nCmdShow=3。
    public const int SW_SHOWMINIMIZED = 2; //激活窗口并将其最小化。nCmdShow=2。
    public const int SW_SHOWMINNOACTIVE = 7;   //窗口最小化,激活窗口仍然维持激活状态。nCmdShow=7。
    public const int SW_SHOWNA = 8;    //以窗口原来的状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=8。
    public const int SW_SHOWNOACTIVATE = 4;    //以窗口最近一次的大小和状态显示窗口。激活窗口仍然维持激活状态。nCmdShow=4。
    public const int SW_SHOWNORMAL = 1; //激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志。nCmdShow=1。

    const uint SWP_SHOWWINDOW = 0x0040;
    public static bool SetWindowPosition(IntPtr hWnd, int winWidth, int winHeight)
    {
        if (!CheckPlatform())
            return false;

        //显示器支持的所有分辨率  
        int i = Screen.resolutions.Length;

        int resWidth = Screen.resolutions[i - 1].width;
        int resHeight = Screen.resolutions[i - 1].height;

        int winPosX = resWidth / 2 - winWidth / 2;
        int winPosY = resHeight / 2 - winHeight / 2;

        return SetWindowPos(hWnd, 0, winPosX, winPosY, winWidth, winHeight, SWP_SHOWWINDOW);
    }

还可以做最大化最小化之类的
做成之后发现虽然这样实现了去边框,设置分辨率,但是是有缺陷的
一般的标准windows应用程序可以在任务栏最小化,关闭,这样设置了后这种操作就不行了
不知道什么原因
后来做exe安装打包,有一个比较好的方法,一般exe需要制作安装程序
程序不做这些设置,打包的时候给exe加上运行参数xx.exe -popup
unity有个运行无窗口的参数,给exe加上就行了,完美解决

你可能感兴趣的:(Unity发布exe去窗口设置分辨率)