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.效果图如下,绑定自定义按钮
总结
代码整体已贴出,功能亲测可用,欢迎学习交流。点赞+收藏+关注哦~