利用Winddows API改变窗口最小化与最大化

在unity中或者在C#程序中,通过Windows API来控制其他程序窗口或者当前窗口最小化与最大化时,该如何操作呢?

  1. 首先需要导入Windows API如:
    [DllImport(“user32.dll”)]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport(“user32.dll”, EntryPoint = “ShowWindow”, CharSet = CharSet.Auto)]
    public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool IsIconic(IntPtr hWnd);
    等常用方法。
    2.如果说要判断其他或者自己程序是否是最小化状态(不支持多开),则可以直接通过窗口名,找到窗口,判断是否是最 小化状态如:
    public bool isminilized()
    {
    IntPtr temp = FindWindow(null,“test”);//test应用窗口名
    return IsIconic(temp );
    }
    3.如果是判断自己程序的最小化状态,而且自己程序又是多开的,那该怎么办?
    当然首先得获取当前程序的句柄:
    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;
    

    }
    然后再用IsIconic方法判断。有的人可能会问, Process.GetCurrentProcess().MainWindowHandle;不是已经可以获取当前句柄吗?至于问什么不可以,我也不是很清楚,欢迎大神指点。详细代码请下载:https://download.csdn.net/download/qq_37699470/11021527

    原文作者:它城他梦
    原文地址: https://blog.csdn.net/qq_37699470/article/details/88572542
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞