我們來比較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