winform窗體this方式和handle(句柄)方式的區別


我們來比較winform窗體的this方式和win32api handle方式實現窗體的最大化、默認窗體、半透明、不透明的區別

1、窗體界面設計

this方式按鈕: btnMaxWindow、 btnNormalWindow、btnOpaWindow 、btnOpacityWindow

handle方式按鈕: btnMaxWindow1、 btnNormalWindow1、btnOpaWindow1 、btnOpacityWindow1

2、使用句柄(handle)

首先在項目中引入所需win32api的函數方法

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

        /// <summary>
        /// windowapi 通過句柄顯示或隱藏窗體函數
        /// </summary>
        /// <param name="hWnd">窗體句柄</param>
        /// <param name="cmdShow">顯示類型(0:隱藏窗體,1:默認大小窗體,2:最小化窗體,3:最大化窗體)</param>
        /// <returns>返回成功或失敗</returns>
        [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
        public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

        /// <summary>
        /// 設置窗體透明度屬性
        /// </summary>
        /// <param name="hwnd">窗體句柄</param>
        /// <param name="crKey">掩碼顏色</param>
        /// <param name="bAlpha">不透明度</param>
        /// <param name="dwFlags">透明方式</param>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);

3、比較this和handle的區別

1) 最大化窗體

        #region  設置窗體最大化(this、handle)
       
        /// <summary>
        /// this方式  設置窗體最大化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnMaxWindow_Click(object sender, EventArgs e)
        {
            //設置窗體狀態為最大化
            this.WindowState = FormWindowState.Maximized;
            //不顯示在任務欄
            this.ShowInTaskbar = false;
            //設置窗體為不可見
           // this.Visible = true;
        }

        /// <summary>
        /// handle方式 通過句柄設置窗體最大化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnMaxWindow1_Click(object sender, EventArgs e)
        {
            //獲取窗體句柄
            IntPtr handle = FindWindow(null, "測試窗體");
            if (handle != IntPtr.Zero)
            {
                //通過句柄,最大化窗體
                ShowWindowAsync(handle, 3);
            }
        }

        #endregion

2)默認窗體

        #region 設置窗體默認大小(this、handle)

        /// <summary>
        /// this方式 設置窗體默認大小
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNormalWindow_Click(object sender, EventArgs e)
        {
            //設置窗體狀態為默認大小
            this.WindowState = FormWindowState.Normal;
            //不顯示在任務欄
            this.ShowInTaskbar = false;
            //設置窗體為不可見
            //this.Visible = false;
        }

        /// <summary>
        /// handle方法  設置窗體默認大小
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNormalWindow1_Click(object sender, EventArgs e)
        {
            //獲取窗體句柄
            IntPtr handle = FindWindow(null, "測試窗體");
            if (handle != IntPtr.Zero)
            {
                //通過句柄,彈出窗體默認大小
                ShowWindowAsync(handle, 1);
            }
        }

        #endregion 

3)半透明窗體

        #region 設置窗體為半透明(this、handle)
           
        /// <summary>
        /// this方式 設置窗體透明度為半透明
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpaWindow_Click(object sender, EventArgs e)
        {
            //設置當前窗體為不透明度為0.5
            this.Opacity = 0.5;
        }

        /// <summary>
        /// handle方式 設置窗體透明度為半透明
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpaWindow1_Click(object sender, EventArgs e)
        {
            //通過win32FindWindow()函數,獲取窗體的句柄
            IntPtr handle = FindWindow(null, "測試窗體");
            if (handle != IntPtr.Zero)
            {
                //通過句柄,設置窗體透明度為半透明(第一個參數:窗體句柄;第二參數:掩碼顏色;第三個參數:透明度,范圍0-255)
                SetLayeredWindowAttributes(handle, 0, 128, 0x00000002);
            }
        }

        #endregion

4)不透明窗體

 #region 設置窗體為不透明(this、handle)

        /// <summary>
        /// this方式 設置窗體為不透明
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpacityWindow_Click(object sender, EventArgs e)
        {
            //設置窗體為不透明(0~1)
            this.Opacity = 1;
        }

        /// <summary>
        /// handle方式  設置窗體為不透明
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpacityWindow1_Click(object sender, EventArgs e)
        {
            //通過win32FindWindow()函數,獲取窗體的句柄
            IntPtr handle = FindWindow(null, "測試窗體");
            if (handle != IntPtr.Zero)
            {
                //通過句柄,設置窗體透明度為不透明(第一個參數:窗體句柄;第二參數:掩碼顏色;第三個參數:透明度,范圍0-255)
                SetLayeredWindowAttributes(handle, 0, 255, 0x00000002);
            }
        }

        #endregion 

4、完整源碼

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 Form1 : Form
    {
        /// <summary>
        /// windowapi 找到指定窗體的句柄函數
        /// </summary>
        /// <param name="lpClassName">窗體類名</param>
        /// <param name="lpWindowName">窗體標題名</param>
        /// <returns>返回窗體句柄(IntPtr)</returns>
        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        /// <summary>
        /// windowapi 通過句柄顯示或隱藏窗體函數
        /// </summary>
        /// <param name="hWnd">窗體句柄</param>
        /// <param name="cmdShow">顯示類型(0:隱藏窗體,1:默認大小窗體,2:最小化窗體,3:最大化窗體)</param>
        /// <returns>返回成功或失敗</returns>
        [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
        public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

        /// <summary>
        /// 設置窗體透明度屬性
        /// </summary>
        /// <param name="hwnd">窗體句柄</param>
        /// <param name="crKey">掩碼顏色</param>
        /// <param name="bAlpha">不透明度</param>
        /// <param name="dwFlags">透明方式</param>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);
    

        public Form1()
        {
            InitializeComponent();
            //第一次運行彈出顯示在屏幕中間
            this.StartPosition = FormStartPosition.CenterScreen;
        }


        #region  設置窗體最大化(this、handle)
       
        /// <summary>
        /// this方式  設置窗體最大化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnMaxWindow_Click(object sender, EventArgs e)
        {
            //設置窗體狀態為最大化
            this.WindowState = FormWindowState.Maximized;
            //不顯示在任務欄
            this.ShowInTaskbar = true;
            //設置窗體為不可見
           // this.Visible = true;
        }

        /// <summary>
        /// handle方式 通過句柄設置窗體最大化
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnMaxWindow1_Click(object sender, EventArgs e)
        {
            //獲取窗體句柄
            IntPtr handle = FindWindow(null, "測試窗體");
            if (handle != IntPtr.Zero)
            {
                //通過句柄,最大化窗體
                ShowWindowAsync(handle, 3);
            }
        }

        #endregion

        #region 設置窗體默認大小(this、handle)

        /// <summary>
        /// this方式 設置窗體默認大小
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNormalWindow_Click(object sender, EventArgs e)
        {
            //設置窗體狀態為默認大小
            this.WindowState = FormWindowState.Normal;
            //不顯示在任務欄
            this.ShowInTaskbar = false;
            //設置窗體為不可見
            //this.Visible = false;
        }

        /// <summary>
        /// handle方法  設置窗體默認大小
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnNormalWindow1_Click(object sender, EventArgs e)
        {
            //獲取窗體句柄
            IntPtr handle = FindWindow(null, "測試窗體");
            if (handle != IntPtr.Zero)
            {
                //通過句柄,彈出窗體默認大小
                ShowWindowAsync(handle, 1);
            }
        }

        #endregion 

        #region 設置窗體為半透明(this、handle)
           
        /// <summary>
        /// this方式 設置窗體透明度為半透明
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpaWindow_Click(object sender, EventArgs e)
        {
            //設置當前窗體為不透明度為0.5
            this.Opacity = 0.5;
        }

        /// <summary>
        /// handle方式 設置窗體透明度為半透明
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpaWindow1_Click(object sender, EventArgs e)
        {
            //通過win32FindWindow()函數,獲取窗體的句柄
            IntPtr handle = FindWindow(null, "測試窗體");
            if (handle != IntPtr.Zero)
            {
                //通過句柄,設置窗體透明度為半透明(第一個參數:窗體句柄;第二參數:掩碼顏色;第三個參數:透明度,范圍0-255)
                SetLayeredWindowAttributes(handle, 0, 128, 0x00000002);
            }
        }

        #endregion

        #region 設置窗體為不透明(this、handle)

        /// <summary>
        /// this方式 設置窗體為不透明
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpacityWindow_Click(object sender, EventArgs e)
        {
            //設置窗體為不透明(0~1)
            this.Opacity = 1;
        }

        /// <summary>
        /// handle方式  設置窗體為不透明
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpacityWindow1_Click(object sender, EventArgs e)
        {
            //通過win32FindWindow()函數,獲取窗體的句柄
            IntPtr handle = FindWindow(null, "測試窗體");
            if (handle != IntPtr.Zero)
            {
                //通過句柄,設置窗體透明度為不透明(第一個參數:窗體句柄;第二參數:掩碼顏色;第三個參數:透明度,范圍0-255)
                SetLayeredWindowAttributes(handle, 0, 255, 0x00000002);
            }
        }

        #endregion      

    }

}

 

5、演示窗體順序

(1)先按this方式的最大化窗體,handle方式恢復默認1

(2)先按handle方式的最大化窗體1,this方式恢復默認

(3)先按this方式的半透明窗體,handle方式不透明窗體1

(4)先按handle方式的半透明窗體1,this方式不透明窗體

演示的效圖

按了this方式的半透明按鈕

按鈕handle方式不透明按鈕1

 


免責聲明!

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



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