Unity window operation

Unity calls win32 operation window

1. Basic operation

(1) full screen

(2) Minimize

(3) Full screen except taskbar

(4) Change the title bar text

(5) Set borderless, window position and resolution

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

/// <summary>
/// 窗口工具系统类(窗口状态)
/// </summary>
public class WindowManager : MonoBehaviour
{
    
    
    #region 系统字段 & 系统方法

    //设置当前窗口的显示状态
    [DllImport("user32.dll")]
    public static extern bool ShowWindow(System.IntPtr hwnd, int nCmdShow);

    //获取当前激活窗口
    [DllImport("user32.dll", EntryPoint = "GetForegroundWindow")]
    public static extern System.IntPtr GetForegroundWindow();

    //获取指定unity.exe窗口
    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    //public static IntPtr ParenthWnd = FindWindow(null, "ProjectName");    //build时候的项目名,playerSetting中设置的
    public static IntPtr ParenthWnd = FindWindow(null, "Win");    //build时候的项目名,playerSetting中设置的

    //设置窗口边框
    [DllImport("user32.dll")]
    public static extern IntPtr SetWindowLong(IntPtr hwnd, int _nIndex, int dwNewLong);

    //设置窗口位置,尺寸
    [DllImport("user32.dll")]
    public static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

    //窗口拖动
    [DllImport("user32.dll")]
    public static extern bool ReleaseCapture();
    [DllImport("user32.dll")]
    public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

    //更改标题栏
    [DllImport("user32.dll")]
    public static extern int SetWindowText(IntPtr hWnd, string text);

    //使用查找任务栏
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string strClassName, int nptWindowName);

    //获取窗口位置以及大小
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
    
    
        public int Left; //最左坐标
        public int Top; //最上坐标
        public int Right; //最右坐标
        public int Bottom; //最下坐标
    }

    //边框参数
    private const uint SWP_SHOWWINDOW = 0x0040;
    private const int GWL_STYLE = -16;
    private const int WS_BORDER = 1;

    //隐藏标题栏图标
    private const int WS_POPUP = 0x800000;
    private const int WS_SYSMENU = 0x80000;

    //最大最小化
    private const int SW_SHOWMINIMIZED = 2;//(最小化窗口)
    private const int SW_SHOWMAXIMIZED = 3;//最大化窗口

    //去除标题栏保留边框
    private const int WS_CAPTION = 0x00C00000;
    private const int WS_THICKFRAME = 0x00040000;

    #endregion

    #region 方法

    /// <summary>
    /// 最小化窗口
    /// </summary>
    public void SetMinWindows()
    {
    
    
        ShowWindow(ParenthWnd, SW_SHOWMINIMIZED);
    }

    private bool taskbarFullScreen = false;//是否是任务栏全屏
    // <summary>
    /// 最大化窗口:窗口全屏
    /// </summary>
    public void SetMaxWindows()
    {
    
    
        if (taskbarFullScreen)
            SetWindowPos(ParenthWnd, 0, 0, 0, Screen.currentResolution.width, Screen.currentResolution.height + GetTaskBarHeight(), SWP_SHOWWINDOW);
        else
            ShowWindow(GetForegroundWindow(), SW_SHOWMAXIMIZED);
    }

    
    /// <summary>
    /// 除任务栏外最大化窗口
    /// </summary>
    public void TaskbarMaxWindow()
    {
    
    
        int currMaxScreenHeight = Screen.currentResolution.height - GetTaskBarHeight();
        SetWindowPos(ParenthWnd, 0, 0, 0, Screen.currentResolution.width, currMaxScreenHeight, SWP_SHOWWINDOW);
        taskbarFullScreen = !taskbarFullScreen;
        
    }


    /// <summary>
    /// 设置无边框,窗口位置及分辨率
    /// </summary>
    /// <param name="rect">尺寸数据</param>
    public void SetNoFrameWindow(Rect rect, bool isMax, bool isDrag = false)
    {
    
    
        if (!isDrag)
        {
    
    
            //去除上边栏(不可拖拽缩放)
            SetWindowLong(ParenthWnd, GWL_STYLE, WS_POPUP);
        }
        else
        {
    
    
            if (!isMax)
            {
    
    
                //设置拖拽缩放模式
                SetWindowLong(ParenthWnd, GWL_STYLE, GetWindowLong(ParenthWnd, GWL_STYLE)
         & ~WS_CAPTION | WS_THICKFRAME);
            }
            else
            {
    
    
                //去除上边栏(不可拖拽缩放)
                SetWindowLong(ParenthWnd, GWL_STYLE, WS_POPUP);
            }
        }

        //隐藏上边栏(部分)
        // SetWindowLong(GetForegroundWindow(), GWL_STYLE, GetWindowLong(GetForegroundWindow(), GWL_STYLE) & ~WS_POPUP);

        if (isMax)
        {
    
    
            SetMaxWindows();
        }
        else
        {
    
    
            //设置窗口位置及分辨率
            bool result = SetWindowPos(ParenthWnd, 0, (int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height, SWP_SHOWWINDOW);
        }
    }

    /// <summary>
    /// 拖动窗口
    /// </summary>
    /// <param name="window">当前句柄</param>
    public void DragWindow(IntPtr window)
    {
    
    
        ReleaseCapture();
        SendMessage(window, 0xA1, 0x02, 0);
        SendMessage(window, 0x0202, 0, 0);
    }


    public string titleText;
    /// <summary>
    /// 改变标题栏标题
    /// </summary>
    public void ChangeTitleText()
    {
    
    
        SetWindowText(ParenthWnd, titleText);
    }

    /// <summary>
    /// 获取当前窗口尺寸
    /// </summary>
    /// <returns></returns>
    public Rect GetWindowInfo()
    {
    
    
        RECT rect = new RECT();
        Rect targetRect = new Rect();
        GetWindowRect(ParenthWnd, ref rect);
        targetRect.width = Mathf.Abs(rect.Right - rect.Left);
        targetRect.height = Mathf.Abs(rect.Top - rect.Bottom);
        targetRect.x = rect.Left;
        targetRect.y = rect.Top;
        return targetRect;
    }

    #endregion

    #region Private Methods

    /// <summary>
    /// 获取任务栏高度
    /// </summary>
    /// <returns>任务栏高度</returns>
    private int GetTaskBarHeight()
    {
    
    
        int taskbarHeight = 10;
        IntPtr hWnd = FindWindow("Shell_TrayWnd", 0);
        RECT rect = new RECT();
        GetWindowRect(hWnd, ref rect);
        taskbarHeight = rect.Bottom - rect.Top;
        return taskbarHeight;
    }

    #endregion

    }

}

2. When there is no title bar and upper border, move the scene and drag the window

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

/// <summary>
/// 窗口工具系统类(窗口状态)
/// </summary>
public class WindowsTool : MonoBehaviour
{
    
           
    //获取指定unity.exe窗口
    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    //public static IntPtr ParenthWnd = FindWindow(null, "ProjectName");    //build时候的项目名,playerSetting中设置的
    public static IntPtr ParenthWnd = FindWindow(null, "Win");    //build时候的项目名,playerSetting中设置的

    //设置窗口边框
    [DllImport("user32.dll")]
    public static extern IntPtr SetWindowLong(IntPtr hwnd, int _nIndex, int dwNewLong);

    //设置窗口位置,尺寸
    [DllImport("user32.dll")]
    public static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

    //窗口拖动
    [DllImport("user32.dll")]
    public static extern bool ReleaseCapture();
    [DllImport("user32.dll")]
    public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);


    //边框参数
    private const uint SWP_SHOWWINDOW = 0x0040;
    private const int GWL_STYLE = -16;
    private const int WS_BORDER = 1;

    //隐藏标题栏图标
    private const int WS_POPUP = 0x800000;

    float xx;
    bool bx;
    void Start()
    {
    
    
        bx = false;
        xx = 0f;
#if UNITY_STANDALONE_WIN
        Resolution[] r = Screen.resolutions;
        Rect screenPosition = new Rect((r[r.Length - 1].width - Screen.width) / 2, (r[r.Length - 1].height - Screen.height) / 2, Screen.width, Screen.height);
        //去除上边栏(不可拖拽缩放)
        SetWindowLong(ParenthWnd, GWL_STYLE, WS_POPUP);//将网上的WS_BORDER替换成WS_POPUP  
        //设置窗口位置以及分辨率
        SetWindowPos(ParenthWnd, 0, (int)screenPosition.x, (int)screenPosition.y, (int)screenPosition.width, (int)screenPosition.height, SWP_SHOWWINDOW);
#endif
    }


    void Update()
    {
    
    
#if UNITY_STANDALONE_WIN
        if (Input.GetMouseButtonDown(0))
        {
    
    

            xx = 0f;
            bx = true;
        }
        if (bx && xx >= 0.3f)
        {
    
     //这样做为了区分界面上面其它需要滑动的操作
            ReleaseCapture();
            SendMessage(ParenthWnd, 0xA1, 0x02, 0);
            SendMessage(ParenthWnd, 0x0202, 0, 0);
        }
        if (bx)
            xx += Time.deltaTime;
        if (Input.GetMouseButtonUp(0))
        {
    
    
            xx = 0f;
            bx = false;
        }

#endif
    }
}

3. Freely adjust the window size

insert image description here

4. Adjust the window size to force a fixed ratio

Reference URL:
https://blog.csdn.net/u014661152/article/details/113737625?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc _relevant_default&depth_1 -utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=2

Guess you like

Origin blog.csdn.net/weixin_45686837/article/details/123527785