Unity使用Windows原生user32.dll接口调整窗口分辨率

使用user32.dll的API

    //窗口样式[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)]

使用的参数

    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>public void SetMaxWindows(){int currMaxScreenHeight = Screen.currentResolution.height - GetTaskBarHeight();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>public void SetMinWindows(){ShowWindow(GetForegroundWindow(), SW_SHOWMINIMIZED);}

窗口拖动

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

全屏

    /// <summary>/// 全屏/// </summary>public void SetFullScreen(){ShowWindow(GetForegroundWindow(), SW_SHOWMAXIMIZED);}

完整代码

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

工程文件下载

演示demo下载

Unity窗口分辨率调整相关推荐

  1. Unity 窗口制作 调整窗口大小 动态调整UI大小 窗口拖拽 UI拖拽

    Unity 简易窗口: 首先咱们看一下是不是自己想要的效果 组件可调整参数: 下面是同比例缩放的调整效果,如果只是缩放这个窗口里面的内容,这个是个不错的选择 资源链接: 下载地址.

  2. unity游戏开发分辨率调整

    unity基础界面显示调整

  3. Unity win平台 调整窗口大小强制固定比例

    我写了一个脚本,对独立的Windows版本(仅Windows,32/64位)强制执行任意宽高比. 它通过拦截窗口调整大小事件(特别是WinProc回调函数)并对其进行修改以保持所需的宽高比来工作. 将 ...

  4. win7调整分辨率显示服务器,win7分辨率调整不了怎么解决|win7分辨率调整不了的解决方法...

    分辨率对于显示器来说是至关重要的,安装win764位系统后分辨率都是设置好的,如果不合适,大家可以自己调节.调整分辨率是一件很简单的事,要是遇到win7分辨率调整不了的问题该怎么解决呢?接下来小编告诉 ...

  5. 实时监控窗口分辨率实现网页等比例缩放

    思路: 获取浏览器窗口分辨率,以1080P标准分辨率为基础,进行等比缩放. 并将窗口分辨率进行动态绑定,当窗口大小发生变化时,实时进行等比缩放以保证布局. 该方法同样适用与笔记本的屏幕缩放,因为笔记本 ...

  6. 三星+android7.0+字体,三星S7升级安卓7.0新技能:新增分辨率调整功能

    三星Galaxy Note 7推出了安卓7.0的升级,此次升级后,三星S7将会增加分辨率调整功能.这个功能可以根据用户的需求和喜好来进行调整,在HD(720×1280像素).FHD(1280×1920 ...

  7. matlab 在2k屏幕,如何将4k显示器的分辨率调整为2k,并将2k分辨率用于4k显示器

    如何将4k显示器的分辨率调整为2k,并将2k分辨率用于4k显示器 一个. 调整分辨率: 右键单击桌面上的---"属性" ---"设置" ---"屏幕分 ...

  8. 【ipad 作为 mac 分屏分辨率调整 | sidercar 分辨率调整】

    ipad 作为 mac 分屏分辨率调整 | sidercar 分辨率调整 背景 ipad 分辨率调整 Refs 背景 由于疫情被困在学校,手中只有mac和一个ipad,只能拿ipad作为mac分屏工作 ...

  9. Pycharm 图像分辨率调整 学习笔记

    Pycharm 图像分辨率调整 学习笔记 from __future__ import print_function import os import cv2 import skimage.io as ...

最新文章

  1. 软件项目管理大作业_案例|P6软件在水电项目施工管理中的应用
  2. linux nice值_linux系统管理之交互式企业站点(连载)
  3. handler机制的原理
  4. c++ vector 赋值_C++中vector用法
  5. oracle11g高可用,oracle11g 搭建DG环境总结
  6. mysql课程表学时_Mysql 巩固提升 (学生表_课程表_成绩表_教师表)
  7. matlab表示DFT和DTFT,【 MATLAB 】离散傅里叶级数(DFS)与DFT、DTFT及 z变换之间的关系...
  8. android数据持久化框架,Android:数据持久化、Environment、SharedPreferences、内部存储internalStorage...
  9. CListCtrl 使用方法总结
  10. 祝各位朋友元旦快乐,新年大发!!!
  11. Linux之nmap扫描多网段
  12. wed简介及html简单标签(1)
  13. 为什么要研发vin码识别?
  14. python 中文转拼音原理_Python中文转拼音
  15. 2021年盘州市高考成绩查询,盘州市第一中学2021年招生代码
  16. 面试管:Zookeeper在项目的典型应用场景请你回答一下
  17. vrf中的ipsec
  18. 软件推广:快乐想象识字法全集
  19. 【PCL】VoxelGrid滤波器下采样
  20. 计算机考证哪些最有用

热门文章

  1. nginx配置apache服务器均衡负载出现400报错
  2. C++最小二乘法拟合平面
  3. 解决d3dx9_33.dll文件丢失找不到
  4. 获得当天的 零点 和 当天的最后 一秒的时刻
  5. VMware虚拟机的linux系统无法与主机复制粘贴文字以及文件解决办法
  6. 2022年520好用的电容笔推荐,果粉推荐十款电容笔
  7. down mark 打钩_markdown文档撰写技巧
  8. 第五次实验 紫金学院 集合框架2
  9. Unity 知识总结
  10. 我的完美新娘 - Part 2