接收指令控制unity程序最大化最小化

2022-01-19  本文已影响0人  带着面包去流浪

参考:https://www.jb51.net/article/36226.htm
https://www.freesion.com/article/5390733102/
Newtonsoft.Json.dll 下载地址
链接:https://pan.baidu.com/s/1XLXtUH0ks5jPsgoex_8VnA 提取码:b665

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
using Newtonsoft.Json.Linq;
using System.Diagnostics;

public class ScreenController : MonoBehaviour
{
    private static Hashtable processWnd = null;
    public delegate bool WNDENUMPROC(IntPtr hwnd, uint lParam);

    [DllImport("user32.dll", EntryPoint = "EnumWindows", SetLastError = true)]
    public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, uint lParam);

    [DllImport("user32.dll", EntryPoint = "GetParent", SetLastError = true)]
    public static extern IntPtr GetParent(IntPtr hWnd);

    [DllImport("user32.dll", EntryPoint = "GetWindowThreadProcessId")]
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId);

    [DllImport("user32.dll", EntryPoint = "IsWindow")]
    public static extern bool IsWindow(IntPtr hWnd);

    [DllImport("kernel32.dll", EntryPoint = "SetLastError")]
    public static extern void SetLastError(uint dwErrCode);
    
    [DllImport("user32.dll")]
    public static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);
    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();

    const int SW_SHOWMINIMIZED = 2; //{最小化, **}
    const int SW_SHOWMAXIMIZED = 3;//最大化
    const int SW_SHOWRESTORE = 1;//还原
    public void OnClickMinimize()
    { //最小化 
        ShowWindow(thisPtr, SW_SHOWMINIMIZED);
    }

    public void OnClickMaximize()
    {
        //最大化
        ShowWindow(thisPtr, SW_SHOWMAXIMIZED);
    }

    public void OnClickRestore()
    {
        //还原
        ShowWindow(thisPtr, SW_SHOWRESTORE);
    }

    IntPtr thisPtr;
    private void Start()
    {
        if (processWnd == null)
        {
            processWnd = new Hashtable();
        }
        thisPtr = GetCurrentWindowHandle();
       
        MQDataManager.instance.OnUpdateData += ActionMsg;
        //thisPtr = GetForegroundWindow();
    }
    
    string newOrder;
    
    void ActionMsg(string _msg)
    {
        if (_msg.Contains("type"))
        {
            var jsonObject = JObject.Parse(_msg);
            newOrder = jsonObject["params"]["type"].ToString(); //123
           
            SwitchStatus();
        }
    }

    void SwitchStatus() {
        switch (newOrder)
        {
            case "small":
                //最小化
                OnClickMinimize();
                break;
            case "big":
                //最大化
                OnClickMaximize();
                break;
            case "restore":
                //还原
                OnClickRestore();
                break;
        }
    }


    public static IntPtr GetCurrentWindowHandle()
    {
        IntPtr ptrWnd = IntPtr.Zero;
        uint uiPid = (uint)Process.GetCurrentProcess().Id;  // 当前进程 ID

        object objWnd = processWnd[uiPid];

        if (objWnd != null)
        {
            ptrWnd = (IntPtr)objWnd;
            if (ptrWnd != IntPtr.Zero && IsWindow(ptrWnd))  // 从缓存中获取句柄
            {
                return ptrWnd;
            }
            else
            {
                ptrWnd = IntPtr.Zero;
            }
        }

        bool bResult = EnumWindows(new WNDENUMPROC(EnumWindowsProc), uiPid);
        // 枚举窗口返回 false 并且没有错误号时表明获取成功
        if (!bResult && Marshal.GetLastWin32Error() == 0)
        {
            objWnd = processWnd[uiPid];
            if (objWnd != null)
            {
                ptrWnd = (IntPtr)objWnd;
            }
        }

        return ptrWnd;
    }


    private static bool EnumWindowsProc(IntPtr hwnd, uint lParam)
    {
        uint uiPid = 0;

        if (GetParent(hwnd) == IntPtr.Zero)
        {
            GetWindowThreadProcessId(hwnd, ref uiPid);
            if (uiPid == lParam)    // 找到进程对应的主窗口句柄
            {
                processWnd[uiPid] = hwnd;   // 把句柄缓存起来
                SetLastError(0);    // 设置无错误
                return false;   // 返回 false 以终止枚举窗口
            }
        }

        return true;
    }
}
上一篇下一篇

猜你喜欢

热点阅读