C#winform窗體如何通過windowApi的FindWindow函數獲取窗體句柄


在同一個程序里,傳統方式是通過this來設置當前窗體的最大化、最小化等操作,

那么怎樣通過窗體句柄來設置窗體的最大化、最小化呢?

1、界面布局

通過this設置窗體最大化: name:btnWindowThis

通過handle設置窗體最大化:name:btnWindowHandle

2、設置窗體最大化

1)this方式

直接設置當前窗體的狀態為最大化就可以了,

       /// <summary>
        /// 通過this設置方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnWindowThis_Click(object sender, EventArgs e)
        {
            //通過this.WindowState設置窗體最大化
            this.WindowState = FormWindowState.Maximized;
        } 

2)handle方式

首先獲取當前窗體的句柄,通過句柄控制窗體最大化

        /// <summary>
        /// 通過句柄設置方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnWindowHander_Click(object sender, EventArgs e)
        {
            // 獲取查找窗體句柄(通過窗體標題名)
            IntPtr mainHandle = FindWindow(null, "演示窗體");
            if (mainHandle != IntPtr.Zero)
            {
                //通過句柄設置當前窗體最大化(0:隱藏窗體,1:默認窗體,2:最小化窗體,3:最大化窗體,....)
                bool result = ShowWindowAsync(mainHandle, 3);
            }
        }

Ps: 獲取窗體句柄,也可以用C++的Spy++工具查看(獲取到的句柄是16進制,而FindWindow()是獲取10進制)

3、完整源碼

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsForms
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 獲取窗體的句柄函數
        /// </summary>
        /// <param name="lpClassName">窗口類名</param>
        /// <param name="lpWindowName">窗口標題名</param>
        /// <returns>返回句柄</returns>
        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        /// <summary>
        /// 通過句柄,窗體顯示函數
        /// </summary>
        /// <param name="hWnd">窗體句柄</param>
        /// <param name="cmdShow">顯示方式</param>
        /// <returns>返工成功與否</returns>
        [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
        public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

       
        /// <summary>
        /// 通過句柄設置方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnWindowHander_Click(object sender, EventArgs e)
        {
            // 獲取查找窗體句柄(通過窗體標題名)
            IntPtr mainHandle = FindWindow(null, "演示窗體");
            if (mainHandle != IntPtr.Zero)
            {
                //通過句柄設置當前窗體最大化(0:隱藏窗體,1:默認窗體,2:最小化窗體,3:最大化窗體,....)
                bool result = ShowWindowAsync(mainHandle, 3);
            }
        }
    
        /// <summary>
        /// 通過this設置方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnWindowThis_Click(object sender, EventArgs e)
        {
            //通過this.WindowState設置窗體最大化
            this.WindowState = FormWindowState.Maximized;
        }
    }
}

下一篇,介紹一個程序窗體如何通過句柄控制另一個程序窗體


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM