美文网首页
接收指令控制unity程序最大化最小化

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

作者: 带着面包去流浪 | 来源:发表于2022-01-19 17:04 被阅读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;
        }
    }
    

    相关文章

      网友评论

          本文标题:接收指令控制unity程序最大化最小化

          本文链接:https://www.haomeiwen.com/subject/wygrhrtx.html