Unity打包窗口化放大、缩小、拖拽功能、无边框设置 C#

Unity打包Windows窗口实现放大、缩小、拖拽、无边框


文章目录

  • Unity打包Windows窗口实现放大、缩小、拖拽、无边框
  • 前言
  • 一、引入 user32.dll
  • 二、使用步骤
    • 1.引入库
    • 2.功能封装
    • 3.效果图如下,绑定自定义按钮
  • 总结


前言

Unity无边框设置、窗口化放大、缩小、拖拽
提示:PC端打包,测试尽量在打包后测试。
编辑器下测试会有意想不到的后果呦~~


一、引入 user32.dll

[DllImport("user32.dll")]

二、使用步骤

1.引入库

代码如下:

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);

        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll")]
        private static extern IntPtr SetWindowLong(IntPtr hwnd, int _nIndex, int dwNewLong);

        [DllImport("user32.dll")]
        private static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy,
            uint uFlags);

        [DllImport("user32.dll")]
        private static extern bool ReleaseCapture();

        [DllImport("user32.dll")]
        private static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

2.功能封装

代码如下:注释详细,不懂就问哈

 public class WindowSetting : MonoBehaviour
    {
        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);

        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll")]
        private static extern IntPtr SetWindowLong(IntPtr hwnd, int _nIndex, int dwNewLong);

        [DllImport("user32.dll")]
        private static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy,
            uint uFlags);

        [DllImport("user32.dll")]
        private static extern bool ReleaseCapture();

        [DllImport("user32.dll")]
        private static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

        const int SW_SHOWMINIMIZED = 2; //{最小化, 激活}
        const int SW_SHOWMAXIMIZED = 3; //最大化
        const int SW_SHOWRESTORE = 1; //还原
        const uint SWP_SHOWWINDOW = 0x0040;
        const int GWL_STYLE = -16;
        const int WS_POPUP = 0x800000;
        private Rect _screenPosition;
        private IntPtr _handle;

        /// <summary>
        /// 放大全屏按钮  缩小按钮  还原窗口按钮  退出按钮
        /// </summary>
        public Button bigBtn, smallBtn, restoreBtn, closeBtn;

        /// <summary>
        /// 自定义屏幕分辨率 长高
        /// </summary>
        private int _screenWidth, _screenHeight;

        private void Start()
        {
            bigBtn.onClick.AddListener(OnClickMaximize);
            smallBtn.onClick.AddListener(OnClickMinimize);
            restoreBtn.onClick.AddListener(OnClickRestore);
            closeBtn.onClick.AddListener(CloseWindow);
            //自定义窗口分辨率
            _screenWidth = 1280;
            _screenHeight = 720;
            
#if UNITY_STANDALONE_WIN && !UNITY_EDITOR //作用是编辑器模式下不运行 尽量打包运行测试
            Resolution[] r = Screen.resolutions;
            _screenPosition =
 new Rect((r[r.Length - 1].width - Screen.width) / 2, (r[r.Length - 1].height - Screen.height) / 2, _screenWidth, _screenHeight);
            SetWindowLong(GetForegroundWindow(), GWL_STYLE, WS_POPUP);//将网上的WS_BORDER替换成WS_POPUP  
            _handle = GetForegroundWindow();   //FindWindow ((string)null, "popu_windows");
            SetWindowPos(GetForegroundWindow(), 0, (int)_screenPosition.x, (int)_screenPosition.y, (int)_screenPosition.width, (int)_screenPosition.height, SWP_SHOWWINDOW);
#endif
        }

        /// <summary>
        /// 最小化 隐藏
        /// </summary>
        private static void OnClickMinimize()
        {
            ShowWindow(GetForegroundWindow(), SW_SHOWMINIMIZED);
        }

        /// <summary>
        /// 最大化 全屏
        /// </summary>
        private static void OnClickMaximize()
        {
            ShowWindow(GetForegroundWindow(), SW_SHOWMAXIMIZED);
        }

        /// <summary>
        /// 还原窗口
        /// </summary>
        private static void OnClickRestore()
        {
            ShowWindow(GetForegroundWindow(), SW_SHOWRESTORE);
        }

        /// <summary>
        /// 退出
        /// </summary>
        private void CloseWindow()
        {
            Application.Quit();
        }

        /// <summary>
        /// 窗口拖拽区域  此处调用可以在按钮上添加EventTrigger组件 使用Drag方法
        /// </summary>
        public void DragWindowsMethod()
        {
            ReleaseCapture();
            SendMessage(_handle, 0xA1, 0x02, 0);
            SendMessage(_handle, 0x0202, 0, 0);
        }
    }

3.效果图如下,绑定自定义按钮

在这里插入图片描述

总结

代码整体已贴出,功能亲测可用,欢迎学习交流。点赞+收藏+关注哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/42370.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ceph

Ceph简介 Ceph使用C语言开发&#xff0c;是一个开放、自我修复和自我管理的开源分布式存储系统。具有高扩展性、高性能、高可靠性的优点。Ceph目前已得到众多云计算厂商的支持并被广泛应用。RedHat及OpenStack&#xff0c;Kubernetes都可与Ceph整合以支持虚拟机镜像的后端存储…

TCP缓冲区和4次挥手调优

目录 如何修改TCP缓冲区才能兼顾并发数量与传输速度&#xff1f; 四次挥手性能调优 1,为什么建立连接是三次握手&#xff0c;而关闭连接需要四次挥手呢? 2.四次挥手的流程,注意5个状态 3.主动方优化 4,被动方调优 最后 如何修改TCP缓冲区才能兼顾并发数量与传输速度&…

APP外包开发中的H5框架

在开发APP的技术中&#xff0c;除了原生开发外也可以使用H5框架来开发。原生开发的特点是质量高&#xff0c;用户体验更好&#xff0c;但成本高&#xff0c;适用于对质量要求高的APP项目。H5框架的特点是通用性较强&#xff0c;对开发人员的要求相对较低&#xff0c;成本也低&a…

【运维】 第02讲(上):企业 Nginx 高性能优化配置实战总结

本课时讲解关于 Nginx 配置优化的内容&#xff0c;相信对于 Nginx 你一定并不陌生&#xff0c;它是一款轻量级的开源 Web 服务及代理程序。在 Nginx 出现之前市场上主流两款 Web 服务&#xff0c;一款是 Windows 系统上的 IIS&#xff0c;另外一款是 Linux 系统上的 Apache。而…

新手如何自学PostgreSQL(PG)

如果你是一个新手&#xff0c;想要自学PostgreSQL&#xff0c;下面是一些步骤和资源&#xff0c;可以帮助你入门&#xff1a; ①了解数据库基础知识&#xff1a;在开始学习PostgreSQL之前&#xff0c;建议你先了解一些数据库的基础概念和术语&#xff0c;例如表、列、行、SQL查…

【统计函数3】——excel常见函数

相关数据资料来源于网易 函数一览&#xff1a; rank、rand、randbetween、floor、int rank函数: 求某单元格在某区域内的排名 RANK(数值,引用区域,降序0/升序1)范围多指定&#xff1a; 分开的范围之间可用逗号隔开&#xff0c;最后再用一个小括号括起来。F4可以快速锁定行和列。…

Android中线程池

一、线程池的优点 说到线程池的优点就要先说一下不用线程池的坏处 在早些年开发都是直接new Thread()直接创建线程&#xff0c;倘若有N个异步就要创建N个线程&#xff0c;这会导致线程的频繁创建和销毁线程不可控&#xff0c;每个线程都各自执行&#xff0c;内存资源竞争激烈&…

STM32定时器中断的使用示例

STM32定时器中断的使用示例 前言硬件和软件cubemx使能定时器中断中断服务函数案例输出结果 前言 上一篇博客实现了定时器输出pwm&#xff0c;这篇接着上次的工程&#xff0c;在上次的工程上做简单的配置即可 硬件和软件 硬件使用的是stm32h750vbt6&#xff1b;软件用到了stm…

微服务系列文章 之 Nginx状态监控日志分析详解

1、Nginx状态监控 Nginx提供了一个内置的状态信息监控页面可用于监控Nginx的整体访问情况&#xff0c;这个功能由ngx_http_stub_status_module模块进行实现。 使用nginx -V 2>&1 | grep -o with-http_stub_status_module命令检测当前Nginx是否有status功能&#xff0c…

JAVA - 内存管理

目录 内存管理是什么 JVM内存区域组成 程序计数器PC java虚拟机栈 本地方法栈 JAVA堆 方法区 常量池 运行时常量池 内存管理是什么 Java的内存管理就是对象的分配和释放问题 分配 &#xff1a;内存的分配由程序完成的&#xff0c;程序员通过关键字new 为每个对象申请…

【iOS】内存管理五大区

参考博客&#xff1a;iOS内存管理学习第一篇-内存五大区 3.1 OC特性之 内存五大区域 1. 简述 程序要想执行&#xff0c;第一步就需要 被加载到内存中 内存五大区域: 栈区,堆区,静态区,常量区,代码段. 栈区&#xff08;stack&#xff09;由编译器自动分配并释放&#xff0c;存放…

React 安装 报错“Modal不能用作jsx组件”

提示 &#xff1a;‘Modal’ cannot be used as a JSX component. 原因&#xff1a;可能导致是类似antd组件报错 要确认react ts 版本是否适配 解决方法&#xff1a; 第一步&#xff1a;查看代码中的 package.json 文件 查看 typescript 与 types/react 第二步&#xff1a;查…

Shuffle简单理解

map的结果本身是无序的&#xff0c;但是map输出的结果有序 mapper和reduce是不同的机器&#xff0c;进行了网络传输&#xff0c;所以存在数据拷贝 第二次排序&#xff0c;是将每个reduce对应的task进行排序&#xff0c;然后再进入reduce maptask运行结束&#xff0c;每个mask块…

详解Windows安装分布式版本控制系统git

文章目录 前言下载安装相关链接 前言 git是一个分布式版本控制软件&#xff0c;最初由Linux创作者Linus Torvalds创作&#xff0c;并于2015年以GPL许可协议发布。git易于学习&#xff0c;占用空间小&#xff0c;性能却快如闪电&#xff0c;可以快速、 高效的管理从小到大的项目…

Java设计模式-责任链(Chain of Responsibility)模式

介绍 Java责任链&#xff08;Chain of Responsibility&#xff09;设计模式是指很多处理对象构成一个链&#xff0c;链中前一个对象指向后一个对象。请求在链中传递&#xff0c;一个请求可以被一个或者多个对象处理。调用方&#xff08;即客户端&#xff09;不知道请求会被链中…

DT灯光基础(辉光 雾 阴影 渲染选项)

点光源 不能宣染&#xff0c;换个版本。不能正常预览 聚光灯 t 手柄 挡光版 平行光阴影 光线追踪阴影 没有看见阴影 灯光使用贴图 环境光 不进行渲染物体 不渲染阴影 接收阴影 不反射 可以看到反射 没有反射了 灯光链接 取消灯照 灯光雾 辉光 变化不明显

瑞芯微|如何让拥有双网口的Linux设备实现数据包转发?

本文主要讲解如何&#xff0c;解决基于3568实现双网口互通问题。 一、组网 如下图所示&#xff1a; rk3568自带2个千兆以太口&#xff0c;对应网卡名称为&#xff1a;eth0、eth1pc1和pc2分别连接这2个网口pc1与eth0连接&#xff0c;网段&#xff1a;192.168.30.0pc2与eth1连…

PostgreSQL 的就业前景如何?

PostgreSQL的就业前景非常广阔&#xff0c;它是一种功能强大、可靠且开源的关系型数据库管理系统。以下是说明PostgreSQL就业前景的几个关键点&#xff1a; 1.高需求&#xff1a;随着企业和组织对数据存储和管理的需求不断增长&#xff0c;对数据库专业人员的需求也在持续上升…

喜讯!旭帆科技成功入驻“科大硅谷”!

2023年7月&#xff0c;安徽旭帆信息科技有限公司&#xff08;以下简称“旭帆科技”&#xff09;成功入驻“科大硅谷”&#xff0c;成为合肥城市发展新引擎、科创生态集群企业队伍中的一员。 “科大硅谷”项目建设总投资约75.82亿&#xff0c;共计17.37平方公里&#xff0c;是聚…

idea手动导入了包但编译运行还是报找不到xxx.jar包的问题

1、先把jar包放目录下并add as libary 2、在pom.xml中加入 <!--添加的本地的外部jar包依赖--><dependency><!--groupId、artifactId、version为自定义&#xff0c;groupId与artifactId但是不能重名--><groupId>JNative</groupId><artifactId…