using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Unity.VisualScripting;
//using UnityEditor.PackageManager.UI;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using UnityEngine.XR;
public class ResolutionTest : MonoBehaviour
{
public InputField if1, if2;
public InputField if3, if4;
public Button bt1, bt2;
public Text txt;
IntPtr hwnd;
private void Start()
{
hwnd = GetForegroundWindow();
#if !UNITY_EDITOR
bt1.onClick.AddListener(() => SetResolution(int.Parse(if1.text), int.Parse(if2.text)));
bt2.onClick.AddListener(() => SetResolution(1600, 900));
SetWindowLong(hwnd, GWL_STYLE, WS_POPUP);
bool result = SetWindowPos(GetForegroundWindow(), 0, 0, 0, 1600, 900, SWP_SHOWWINDOW);
#endif
//GetRect();
}
RECT GetRect()
{
GetWindowRect(hwnd, out RECT rect);
string msg = rect.Left + " " + rect.Right + " " + rect.Top + " " + rect.Bottom;
txt.text = msg;
return rect;
}
int _posX, _posY, _Txtwith, _Txtheight;
void SetResolution(int width, int height)
{
Screen.SetResolution(width, height, false);
GetRect();
_Txtwith = width;
_Txtheight = height;
_posX = int.Parse(if3.text);
_posY = int.Parse(if4.text);
StartCoroutine("Setposition");
}
IEnumerator Setposition()
{
yield return new WaitForSeconds(0.1f); //不知道为什么发布于行后,设置位置的不会生效,我延迟0.1秒就可以
SetWindowLong(GetForegroundWindow(), GWL_STYLE, WS_POPUP); //无边框
bool result = SetWindowPos(GetForegroundWindow(), 0, _posX, _posY, _Txtwith, _Txtheight, SWP_SHOWWINDOW); //设置屏幕大小和位置
}
#region 窗口放大缩小
public int winPosX; //窗口左上角x
public int winPosY; //窗口左上角y
public int minWidth, maxWidth; //窗口宽度
public int minHeight, maxHeight; //窗口高度
[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")]
static extern IntPtr GetForegroundWindow();
const uint SWP_SHOWWINDOW = 0x0040;
const int GWL_STYLE = -16;
const int WS_BORDER = 1;
const int WS_POPUP = 0x800000;
[DllImport("user32.dll")]
static extern bool GetWindowRect(IntPtr hwnd, out RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left; //最左坐标
public int Top; //最上坐标
public int Right; //最右坐标
public int Bottom; //最下坐标
}
///
/// 拖动窗口
///
/// 当前句柄
public void DragWindow(IntPtr window)
{
ReleaseCapture();
SendMessage(window, 0xA1, 0x02, 0);
SendMessage(window, 0x0202, 0, 0);
}
public bool candrag;
//窗口拖动
[DllImport("user32.dll")]
public static extern bool ReleaseCapture();
[DllImport("user32.dll")]
public static extern bool SetCapture(IntPtr hwnd);
[DllImport("user32.dll")]
public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
private void Update()
{
if(Input.GetMouseButtonDown(0))
{
Debug.Log("dndndndndn");
candrag = !EventSystem.current.IsPointerOverGameObject();
Debug.Log(Input.mousePosition);
}
if (Input.GetMouseButton(0)&&candrag)
{
DragWindow(hwnd);
}
if (Input.GetMouseButtonUp(0)&& candrag|| Input.GetKeyDown(KeyCode.R))
{
Debug.Log("upupupup");
SetCapture(hwnd);
SendMessage(hwnd, 0xA2, 0x02, 0);
SendMessage(hwnd, 0x0202, 0, 0);
}
}
////获取当前激活窗口
//[DllImport("user32.dll", EntryPoint = "GetForegroundWindow")]
//public static extern System.IntPtr GetForegroundWindow();
private void WindowSizeEvent(bool ison)
{
if (ison)
{
//显示器支持的所有分辨率
int i = Screen.resolutions.Length;
int resWidth = Screen.resolutions[i - 1].width;
int resHeight = Screen.resolutions[i - 1].height;
winPosX = resWidth / 2 - minWidth / 2;
winPosY = resHeight / 2 - minHeight / 2;
SetWindowLong(GetForegroundWindow(), GWL_STYLE, WS_POPUP);
bool result = SetWindowPos(GetForegroundWindow(), 0, winPosX, winPosY, minWidth, minHeight, SWP_SHOWWINDOW);
//windowSize.GetComponent().sprite = icon_big;//修改图标
}
else
{
//显示器支持的所有分辨率
int i = Screen.resolutions.Length;
int resWidth = Screen.resolutions[i - 1].width;
int resHeight = Screen.resolutions[i - 1].height;
winPosX = resWidth / 2 - minWidth / 2;
winPosY = resHeight / 2 - minHeight / 2;
SetWindowLong(GetForegroundWindow(), GWL_STYLE, WS_POPUP);
bool result = SetWindowPos(GetForegroundWindow(), 0, 0, 0, maxWidth, maxHeight, SWP_SHOWWINDOW);
//windowSize.GetComponent().sprite = icon_smaller;//修改图标
}
}
#endregion
}