Unity窗口操作

unity调用win32操作窗口

1.基本操作

(1)全屏

(2)最小化

(3)除任务栏全屏

(4)改变标题栏文字

(5)设置无边框,窗口位置及分辨率

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.没有标题栏和上边框时,点动场景拖动窗口

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.自由调整窗口大小

在这里插入图片描述

4.调整窗口大小强制固定比例

参考网址:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值