Unity调用系统方法实现窗口去边框,最小化,窗口拖动

功能实现:去除unity发布的exe程序的windows窗口边框,最小化当前程序,并实现窗口拖动。

1,先导入系统方法,并设置一些系统参数 : 代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
using System;
/*xbb
 * 系统方法类
 * */
public class WindowsTools {

    //设置当前窗口的显示状态
    [DllImport("user32.dll")]
    public static extern bool ShowWindow(System.IntPtr hwnd, int nCmdShow);

    //获取当前激活窗口
    [DllImport("user32.dll", EntryPoint = "GetForegroundWindow")]
    public static extern System.IntPtr GetForegroundWindow();

    //设置窗口边框
    [DllImport("user32.dll")]
    public static extern IntPtr SetWindowLong(IntPtr hwnd, int _nIndex, int dwNewLong);

    //设置窗口位置,大小
    [DllImport("user32.dll")]
    public static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

    //窗口拖动
    [DllImport("user32.dll")]
    public static extern bool ReleaseCapture();
    [DllImport("user32.dll")]
    public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

    //边框参数
    const uint SWP_SHOWWINDOW = 0x0040;
    const int GWL_STYLE = -16;
    const int WS_BORDER = 1;
    const int WS_POPUP = 0x800000;
    const int SW_SHOWMINIMIZED = 2;//(最小化窗口)


    //最小化窗口
    public void SetMinWindows()
    {
        ShowWindow(GetForegroundWindow(), SW_SHOWMINIMIZED);
        //具体窗口参数看这     https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx
    }

    //设置无边框,并设置框体大小,位置
    public  void SetNoFrameWindow(Rect rect)
    {
        SetWindowLong(GetForegroundWindow(), GWL_STYLE, WS_POPUP);
        bool result = SetWindowPos(GetForegroundWindow(), 0, (int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height, SWP_SHOWWINDOW);
    }

    //拖动窗口
    public void DragWindow(IntPtr window)
    {
        ReleaseCapture();
        SendMessage(window, 0xA1, 0x02, 0);
        SendMessage(window, 0x0202, 0, 0);
    }
}

2,随便写一个自己使用方便的方法管理类:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

/*xbb
* 
* */
public class WindowsToolMgr : Singleton<WindowsToolMgr>
{

  //系统方法类实体
  public WindowsTools winTool = new WindowsTools();

  //当前Unity程序进程
  private static IntPtr currentWindow;

  void Start()
  {
      currentWindow = WindowsTools.GetForegroundWindow();
  }

  //最小化窗口
  public void MinWindows()
  {
      winTool.SetMinWindows();

  }

  //设置无边框窗口
  public void SetNoFrame()
  {
      //窗口大小  以此为例
      float windowWidth = 1024;
      float windowHeight = 768;
      //计算框体显示位置
      float posX = (Screen.currentResolution.width - windowWidth) / 2;
      float posY = (Screen.currentResolution.height - windowHeight) / 2;
      Rect _rect = new Rect(posX, posY, windowWidth, windowHeight);

      winTool.SetNoFrameWindow(_rect);
  }

  /// <summary>
  /// 全屏
  /// </summary>
  public void FullScreen()
  {
      if (Screen.fullScreen)
      {
          Screen.SetResolution(1024, 768, false);
      }
      else
      {
          Screen.SetResolution(Screen.currentResolution.width, Screen.currentResolution.height, true);
      }
      //等待当前帧完成 再去除边框
      StartCoroutine(IE_NoFrame());
  }

  private IEnumerator IE_NoFrame()
  {
      yield return new WaitForEndOfFrame();
      yield return new WaitForFixedUpdate();
      if (!Screen.fullScreen)
      {
          SetNoFrame();
      }
  }

  //窗口拖动
  public void Drag()
  {
      winTool.DragWindow(currentWindow);
  }
}


3,好了,功能脚本有了,现在弄几个Botton测试一下功能:

初始效果:

Paste_Image.png

去边框效果:

Paste_Image.png

最小化效果: 当前窗口隐藏了(托管在任务栏)

但是Bug来了,我们一般时场景初始化的时候把窗口边框去掉,这个没问题,但是中途切换屏幕全屏之后,再切换回来,窗口边框又出现了!!! 效果如下:

Paste_Image.png
Paste_Image.png

问题原因:当我们执行取消全屏 Screen.SetResolution(1024, 768, false); 时,窗口边框又出来了!!。

那么是不是我们在取消全屏之后再执行一下去边框就可以了呢?如下:

Paste_Image.png

结果发现然并卵,,这个坑啊,,在这里提醒各位兄弟!!!

在unity API 中发现了这个 :

Paste_Image.png

最后那我们在当前帧完成之后再执行去边框就OK了。 如下:

Paste_Image.png

拖动窗口功能:
1,实现UI拖动窗口功能

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

/*xbb
 * 拖动窗口UI
 * */
public class WindowDragObject : MonoBehaviour, IPointerDownHandler, IPointerExitHandler, IPointerUpHandler
{
    private bool isDrag = false;

    void Update()
    {
        if (isDrag ==true)
        {
            WindowsToolMgr.Instance.Drag();
        }
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        isDrag = false;
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isDrag = false;
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        isDrag = true;
    }
}

2,为UI添加功能脚本,并测试,效果如下

Paste_Image.png

以上纯属个人总结, 欢迎各位同仁指正。

最后,奉上工程文件地址。
http://pan.baidu.com/s/1kUTQKmz

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,158评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,600评论 1 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,785评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,655评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,075评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,002评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,146评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,918评论 0 211
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,671评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,838评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,318评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,636评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,343评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,187评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,982评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,126评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,934评论 2 279

推荐阅读更多精彩内容

  • 转自http://www.cnblogs.com/donghua/p/4957415.html Oculus/Ge...
    Moment__格调阅读 3,139评论 0 3
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,644评论 4 59
  • 文/小叶 雨绵绵的下过古城,人民路有我的好心情。 ——序 一 冬至前夜 昨晚用餐期间,我看到了董小姐,吃罢看着我,...
    博土阅读 244评论 0 0
  • 嘻嘻哈哈的初中过去了,紧张繁忙的高中来了。像冬风拂我面般凄凉,疼痛。上学那路上我遇见了曾经熟悉过的你。 还是纯白的...
    李是我AI的小qiao阅读 168评论 0 0