浅谈Unity之窗口分辨率调整-02

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 窗口分辨率调整

前言:每日记录自己学习unity的心得和体会,小弟才疏学浅,如有错误的地方,欢迎大佬们指正,感谢~

image.png

完整代码

using System;

using System.Collections;

using System.Collections.Generic;

using System.Runtime.InteropServices;

using UnityEngine;

using UnityEngine.UI;

public class ScreenResolution : MonoBehaviour

{

   //窗口样式

   [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", EntryPoint = "GetForegroundWindow")]

   static extern IntPtr GetForegroundWindow();

   [DllImport("user32.dll")]

   static extern IntPtr FindWindow(string strClassName, int nptWindowName);

   //窗口拖动

   [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", SetLastError = true)]

   //得到窗口的样式

   private static extern int GetWindowLong(IntPtr hWnd, int nIndex);

   [DllImport("user32.dll")]

   public static extern bool ShowWindow(System.IntPtr hwnd, int nCmdShow);

   //获取窗口位置以及大小

   [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; //最下坐标

   }

   public enum TitleBarStyles

   {

       Hide, Show

   }

   private const int SWP_SHOWWINDOW = 0x0040;

   //边框样式

   private const int GWL_STYLE = -16;

   private const int GWL_EXSTYLE = -20;

   //窗口有细线边框

   private const int WS_BORDER = 1;

   //窗口有一个最大化按钮

   private const int WS_MAXIMIZEBOX = 0x00010000;

   //窗口有一个最小化按钮

   private const int WS_MINIMIZEBOX = 0x00020000;

   //窗口是一个重叠窗口。重叠窗口有标题栏和边框。

   private const int WS_OVERLAPPED = 0x00000000;

   //有标题栏

   private const int WS_TILEDWINDOW = (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);

   //隐藏标题栏图标

   private const int WS_POPUP = 0x800000;

   //窗口的标题栏上有一个窗口菜单。也必须指定ws_CAPTION样式。

   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;

   /// <summary>

   /// 隐藏标题栏修改分辨率

   /// </summary>

   /// <param name="winWidth"></param>

   /// <param name="winHeight"></param>

   /// <param name="winPosX"></param>

   /// <param name="winPosY"></param>

   void ChangeScreenSizeHide(int winWidth, int winHeight, int winPosX, int winPosY)

   {

       if (titleBarStyles== TitleBarStyles.Show)

       {

           //去除标题栏(不可拖拽缩放);一定要加SetWindowPos()设置才会立即生效

           SetWindowLong(GetForegroundWindow(), GWL_STYLE, WS_POPUP);

           //去除标题栏(可拖拽缩放)

           //SetWindowLong(GetForegroundWindow(), GWL_STYLE, GetWindowLong(GetForegroundWindow(), GWL_STYLE) & ~WS_CAPTION | WS_THICKFRAME);

       }

       ChangeScreenSize(winWidth, winHeight, winPosX, winPosY);

       titleBarStyles = TitleBarStyles.Hide;

   }

   //不隐藏标题栏修改分辨率

   void ChangeScreenSizeShow(int winWidth, int winHeight, int winPosX, int winPosY)

   {

       if (titleBarStyles == TitleBarStyles.Hide)

       {

           SetWindowLong(GetForegroundWindow(), GWL_STYLE, GetWindowLong(GetForegroundWindow(), GWL_STYLE) | WS_TILEDWINDOW);

       }

       ChangeScreenSize(winWidth, winHeight, winPosX, winPosY);

       titleBarStyles = TitleBarStyles.Show;

   }

   /// <summary>

   /// 修改分辨率

   /// </summary>

   /// <param name="winWidth"></param>

   /// <param name="winHeight"></param>

   /// <param name="winPosX"></param>

   /// <param name="winPosY"></param>

   /// <param name="winPoscy"></param>

   void ChangeScreenSize(int winWidth, int winHeight, int winPosX, int winPosY)

   {

       SetWindowPos(GetForegroundWindow(), 0, winPosX - (int)(winWidth * 0.5f), winPosY - (int)(winHeight * 0.5f), winWidth, winHeight, SWP_SHOWWINDOW);

   }

   void Delay(float seconds, Action onFinished)

   {

       StartCoroutine(DelayCoroutione(seconds, onFinished));

   }

   private IEnumerator DelayCoroutione(float seconds, Action onFinished)

   {

       yield return new WaitForSeconds(seconds);

       onFinished();

   }

   /// <summary>

   /// 窗口最大化

   /// </summary>

   public void SetMaxWindows()

   {

       int currMaxScreenHeight = Screen.currentResolution.height - GetTaskBarHeight();

       ChangeScreenSizeHide(Screen.currentResolution.width, currMaxScreenHeight,  (int)(Screen.currentResolution.width * 0.5f), (int)(currMaxScreenHeight * 0.5f));

      // SetWindowPos(GetForegroundWindow(), 0, 0, 0, Screen.currentResolution.width, currMaxScreenHeight, SWP_SHOWWINDOW);

   }

   /// <summary>

   /// 获取任务栏高度

   /// </summary>

   /// <returns>任务栏高度</returns>

   private int GetTaskBarHeight()

   {

       int taskbarHeight = 0;

       IntPtr hWnd = FindWindow("Shell_TrayWnd", 0);

       RECT rect = new RECT();

       GetWindowRect(hWnd, ref rect);

       taskbarHeight = (int)rect.Bottom - (int)rect.Top;

       Debug.Log(taskbarHeight);

       return taskbarHeight;

   }

   /// <summary>

   /// 拖动窗口

   /// </summary>

   /// <param name="window">当前句柄</param>

   public void DragWindow()

   {

       ReleaseCapture();

       SendMessage(GetForegroundWindow(), 0xA1, 0x02, 0);

       SendMessage(GetForegroundWindow(), 0x0202, 0, 0);

   }

   /// <summary>

   /// 最小化窗口

   /// </summary>

   public void SetMinWindows()

   {

       ShowWindow(GetForegroundWindow(), SW_SHOWMINIMIZED);

   }

   /// <summary>

   /// 全屏

   /// </summary>

   public void SetFullScreen()

   {

       ShowWindow(GetForegroundWindow(), SW_SHOWMAXIMIZED);

   }

}

相关文章
|
编解码 API 图形学
|
编解码 监控 图形学
Unity 窗口界面的简单介绍
Unity 窗口界面的简单介绍
501 0
Unity 窗口界面的简单介绍
|
图形学
Unity3D初识---窗口和菜单基础介绍
目录 目录 窗口界面介绍: scene: Game : Hierarchy: Project: Inspector: 其他窗口: 菜单界面 File文件菜单 Edit编辑菜单 窗口界面介绍: scene: 在场景编译窗口中可以鼠标右键选中之后移动鼠标就可以自由的浏览场景,并选择物体对其可以进行操作,按下Q\W\E\R四个键时可以画面中的将会进行变换,第一个图标可以进行拖动、第二个图标可以对物体进行位移,第三个图标可以对物体进行旋转,第四个图标可以对物体进行放大缩小。
1302 0
|
Go 图形学
unity Hierarchy窗口对象的显示和隐藏与锁定
setting.png 将脚本QuickToggle放置到Editor目标下 /* Copyright 2017, Jeiel Aranal Permission is hereby granted, free of charge, t...
2603 0
|
测试技术 图形学
Unity用GUI绘制Debug/print窗口/控制台-打包后测试
Unity游戏视窗控制台输出 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar —— 心...
2093 0
|
图形学 Windows
unity 实现调用Windows窗口/对话框交互
Unity调用Window窗口 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar ——...
1855 0
|
Web App开发 图形学 Windows
Unity 3D调用Windows打开、保存窗口、文件浏览器
Unity调用Window窗口 本文提供全流程,中文翻译。 Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) Chinar ——...
3335 0
|
图形学
unity3d UGUI的down与up弹窗,松开时关闭窗口处理机制
挂载到对象即可,然后注册回调做down和up的处理 using UnityEngine; using UnityEngine.EventSystems; public class PushListener : MonoBehaviour,IPointe...
820 0
unity3d实现Game窗口的Stats
示例.png using UnityEngine; using System.Text; using UnityEditor; public class ShowFps : MonoBehaviour { public bool...
1147 0
|
4月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
224 6

热门文章

最新文章