我们来比较winform窗体的this方式和win32api handle方式实现窗体的最大化、默认窗体、半透明、不透明的区别

1、窗体界面设计

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

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

2、使用句柄(handle)

首先在项目中引入所需win32api的函数方法

  1. /// <summary>
  2. /// windowapi 找到指定窗体的句柄函数
  3. /// </summary>
  4. /// <param name="lpClassName">窗体类名</param>
  5. /// <param name="lpWindowName">窗体标题名</param>
  6. /// <returns>返回窗体句柄(IntPtr)</returns>
  7. [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
  8. public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  9.  
  10. /// <summary>
  11. /// windowapi 通过句柄显示或隐藏窗体函数
  12. /// </summary>
  13. /// <param name="hWnd">窗体句柄</param>
  14. /// <param name="cmdShow">显示类型(0:隐藏窗体,1:默认大小窗体,2:最小化窗体,3:最大化窗体)</param>
  15. /// <returns>返回成功或失败</returns>
  16. [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
  17. public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
  18.  
  19. /// <summary>
  20. /// 设置窗体透明度属性
  21. /// </summary>
  22. /// <param name="hwnd">窗体句柄</param>
  23. /// <param name="crKey">掩码颜色</param>
  24. /// <param name="bAlpha">不透明度</param>
  25. /// <param name="dwFlags">透明方式</param>
  26. /// <returns></returns>
  27. [DllImport("user32.dll", SetLastError = true)]
  28. static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);

3、比较this和handle的区别

1) 最大化窗体

  1. #region 设置窗体最大化(this、handle)
  2.  
  3. /// <summary>
  4. /// this方式 设置窗体最大化
  5. /// </summary>
  6. /// <param name="sender"></param>
  7. /// <param name="e"></param>
  8. private void btnMaxWindow_Click(object sender, EventArgs e)
  9. {
  10. //设置窗体状态为最大化
  11. this.WindowState = FormWindowState.Maximized;
  12. //不显示在任务栏
  13. this.ShowInTaskbar = false;
  14. //设置窗体为不可见
  15. // this.Visible = true;
  16. }
  17.  
  18. /// <summary>
  19. /// handle方式 通过句柄设置窗体最大化
  20. /// </summary>
  21. /// <param name="sender"></param>
  22. /// <param name="e"></param>
  23. private void btnMaxWindow1_Click(object sender, EventArgs e)
  24. {
  25. //获取窗体句柄
  26. IntPtr handle = FindWindow(null, "测试窗体");
  27. if (handle != IntPtr.Zero)
  28. {
  29. //通过句柄,最大化窗体
  30. ShowWindowAsync(handle, );
  31. }
  32. }
  33.  
  34. #endregion

2)默认窗体

  1. #region 设置窗体默认大小(this、handle)
  2.  
  3. /// <summary>
  4. /// this方式 设置窗体默认大小
  5. /// </summary>
  6. /// <param name="sender"></param>
  7. /// <param name="e"></param>
  8. private void btnNormalWindow_Click(object sender, EventArgs e)
  9. {
  10. //设置窗体状态为默认大小
  11. this.WindowState = FormWindowState.Normal;
  12. //不显示在任务栏
  13. this.ShowInTaskbar = false;
  14. //设置窗体为不可见
  15. //this.Visible = false;
  16. }
  17.  
  18. /// <summary>
  19. /// handle方法 设置窗体默认大小
  20. /// </summary>
  21. /// <param name="sender"></param>
  22. /// <param name="e"></param>
  23. private void btnNormalWindow1_Click(object sender, EventArgs e)
  24. {
  25. //获取窗体句柄
  26. IntPtr handle = FindWindow(null, "测试窗体");
  27. if (handle != IntPtr.Zero)
  28. {
  29. //通过句柄,弹出窗体默认大小
  30. ShowWindowAsync(handle, );
  31. }
  32. }
  33.  
  34. #endregion

3)半透明窗体

  1. #region 设置窗体为半透明(this、handle)
  2.  
  3. /// <summary>
  4. /// this方式 设置窗体透明度为半透明
  5. /// </summary>
  6. /// <param name="sender"></param>
  7. /// <param name="e"></param>
  8. private void btnOpaWindow_Click(object sender, EventArgs e)
  9. {
  10. //设置当前窗体为不透明度为0.5
  11. this.Opacity = 0.5;
  12. }
  13.  
  14. /// <summary>
  15. /// handle方式 设置窗体透明度为半透明
  16. /// </summary>
  17. /// <param name="sender"></param>
  18. /// <param name="e"></param>
  19. private void btnOpaWindow1_Click(object sender, EventArgs e)
  20. {
  21. //通过win32FindWindow()函数,获取窗体的句柄
  22. IntPtr handle = FindWindow(null, "测试窗体");
  23. if (handle != IntPtr.Zero)
  24. {
  25. //通过句柄,设置窗体透明度为半透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
  26. SetLayeredWindowAttributes(handle, , , 0x00000002);
  27. }
  28. }
  29.  
  30. #endregion

4)不透明窗体

  1. #region 设置窗体为不透明(this、handle)
  2.  
  3. /// <summary>
  4. /// this方式 设置窗体为不透明
  5. /// </summary>
  6. /// <param name="sender"></param>
  7. /// <param name="e"></param>
  8. private void btnOpacityWindow_Click(object sender, EventArgs e)
  9. {
  10. //设置窗体为不透明(0~1)
  11. this.Opacity = ;
  12. }
  13.  
  14. /// <summary>
  15. /// handle方式 设置窗体为不透明
  16. /// </summary>
  17. /// <param name="sender"></param>
  18. /// <param name="e"></param>
  19. private void btnOpacityWindow1_Click(object sender, EventArgs e)
  20. {
  21. //通过win32FindWindow()函数,获取窗体的句柄
  22. IntPtr handle = FindWindow(null, "测试窗体");
  23. if (handle != IntPtr.Zero)
  24. {
  25. //通过句柄,设置窗体透明度为不透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
  26. SetLayeredWindowAttributes(handle, , , 0x00000002);
  27. }
  28. }
  29.  
  30. #endregion

4、完整源码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11.  
  12. namespace WindowsForms
  13. {
  14.  
  15. public partial class Form1 : Form
  16. {
  17. /// <summary>
  18. /// windowapi 找到指定窗体的句柄函数
  19. /// </summary>
  20. /// <param name="lpClassName">窗体类名</param>
  21. /// <param name="lpWindowName">窗体标题名</param>
  22. /// <returns>返回窗体句柄(IntPtr)</returns>
  23. [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
  24. public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
  25.  
  26. /// <summary>
  27. /// windowapi 通过句柄显示或隐藏窗体函数
  28. /// </summary>
  29. /// <param name="hWnd">窗体句柄</param>
  30. /// <param name="cmdShow">显示类型(0:隐藏窗体,1:默认大小窗体,2:最小化窗体,3:最大化窗体)</param>
  31. /// <returns>返回成功或失败</returns>
  32. [DllImport("user32.dll", EntryPoint = "ShowWindowAsync", SetLastError = true)]
  33. public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
  34.  
  35. /// <summary>
  36. /// 设置窗体透明度属性
  37. /// </summary>
  38. /// <param name="hwnd">窗体句柄</param>
  39. /// <param name="crKey">掩码颜色</param>
  40. /// <param name="bAlpha">不透明度</param>
  41. /// <param name="dwFlags">透明方式</param>
  42. /// <returns></returns>
  43. [DllImport("user32.dll", SetLastError = true)]
  44. static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);
  45.  
  46. public Form1()
  47. {
  48. InitializeComponent();
  49. //第一次运行弹出显示在屏幕中间
  50. this.StartPosition = FormStartPosition.CenterScreen;
  51. }
  52.  
  53. #region 设置窗体最大化(this、handle)
  54.  
  55. /// <summary>
  56. /// this方式 设置窗体最大化
  57. /// </summary>
  58. /// <param name="sender"></param>
  59. /// <param name="e"></param>
  60. private void btnMaxWindow_Click(object sender, EventArgs e)
  61. {
  62. //设置窗体状态为最大化
  63. this.WindowState = FormWindowState.Maximized;
  64. //不显示在任务栏
  65. this.ShowInTaskbar = true;
  66. //设置窗体为不可见
  67. // this.Visible = true;
  68. }
  69.  
  70. /// <summary>
  71. /// handle方式 通过句柄设置窗体最大化
  72. /// </summary>
  73. /// <param name="sender"></param>
  74. /// <param name="e"></param>
  75. private void btnMaxWindow1_Click(object sender, EventArgs e)
  76. {
  77. //获取窗体句柄
  78. IntPtr handle = FindWindow(null, "测试窗体");
  79. if (handle != IntPtr.Zero)
  80. {
  81. //通过句柄,最大化窗体
  82. ShowWindowAsync(handle, );
  83. }
  84. }
  85.  
  86. #endregion
  87.  
  88. #region 设置窗体默认大小(this、handle)
  89.  
  90. /// <summary>
  91. /// this方式 设置窗体默认大小
  92. /// </summary>
  93. /// <param name="sender"></param>
  94. /// <param name="e"></param>
  95. private void btnNormalWindow_Click(object sender, EventArgs e)
  96. {
  97. //设置窗体状态为默认大小
  98. this.WindowState = FormWindowState.Normal;
  99. //不显示在任务栏
  100. this.ShowInTaskbar = false;
  101. //设置窗体为不可见
  102. //this.Visible = false;
  103. }
  104.  
  105. /// <summary>
  106. /// handle方法 设置窗体默认大小
  107. /// </summary>
  108. /// <param name="sender"></param>
  109. /// <param name="e"></param>
  110. private void btnNormalWindow1_Click(object sender, EventArgs e)
  111. {
  112. //获取窗体句柄
  113. IntPtr handle = FindWindow(null, "测试窗体");
  114. if (handle != IntPtr.Zero)
  115. {
  116. //通过句柄,弹出窗体默认大小
  117. ShowWindowAsync(handle, );
  118. }
  119. }
  120.  
  121. #endregion
  122.  
  123. #region 设置窗体为半透明(this、handle)
  124.  
  125. /// <summary>
  126. /// this方式 设置窗体透明度为半透明
  127. /// </summary>
  128. /// <param name="sender"></param>
  129. /// <param name="e"></param>
  130. private void btnOpaWindow_Click(object sender, EventArgs e)
  131. {
  132. //设置当前窗体为不透明度为0.5
  133. this.Opacity = 0.5;
  134. }
  135.  
  136. /// <summary>
  137. /// handle方式 设置窗体透明度为半透明
  138. /// </summary>
  139. /// <param name="sender"></param>
  140. /// <param name="e"></param>
  141. private void btnOpaWindow1_Click(object sender, EventArgs e)
  142. {
  143. //通过win32FindWindow()函数,获取窗体的句柄
  144. IntPtr handle = FindWindow(null, "测试窗体");
  145. if (handle != IntPtr.Zero)
  146. {
  147. //通过句柄,设置窗体透明度为半透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
  148. SetLayeredWindowAttributes(handle, , , 0x00000002);
  149. }
  150. }
  151.  
  152. #endregion
  153.  
  154. #region 设置窗体为不透明(this、handle)
  155.  
  156. /// <summary>
  157. /// this方式 设置窗体为不透明
  158. /// </summary>
  159. /// <param name="sender"></param>
  160. /// <param name="e"></param>
  161. private void btnOpacityWindow_Click(object sender, EventArgs e)
  162. {
  163. //设置窗体为不透明(0~1)
  164. this.Opacity = ;
  165. }
  166.  
  167. /// <summary>
  168. /// handle方式 设置窗体为不透明
  169. /// </summary>
  170. /// <param name="sender"></param>
  171. /// <param name="e"></param>
  172. private void btnOpacityWindow1_Click(object sender, EventArgs e)
  173. {
  174. //通过win32FindWindow()函数,获取窗体的句柄
  175. IntPtr handle = FindWindow(null, "测试窗体");
  176. if (handle != IntPtr.Zero)
  177. {
  178. //通过句柄,设置窗体透明度为不透明(第一个参数:窗体句柄;第二参数:掩码颜色;第三个参数:透明度,范围0-255)
  179. SetLayeredWindowAttributes(handle, , , 0x00000002);
  180. }
  181. }
  182.  
  183. #endregion
  184.  
  185. }
  186.  
  187. }

5、演示窗体顺序

(1)先按this方式的最大化窗体,handle方式恢复默认1

(2)先按handle方式的最大化窗体1,this方式恢复默认

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

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

演示的效图

按了this方式的半透明按钮

按钮handle方式不透明按钮1

winform窗体this方式和handle(句柄)方式的区别的更多相关文章

  1. winform窗体控件(全)

    回顾跟补充下除了昨天那常用6个其他的winform窗体控件作用 1:Button:按钮 (1)AutoSize:如果是True的情况下,内容将会撑开:False的话会另起一行 (2)Enabled: ...

  2. 重绘Winform窗体

    本文转载自:http://www.cnblogs.com/encoding/p/5603080.html 按照惯例,先来几张样例图(注:为了展示窗口阴影效果,截图范围向外扩展了些,各位凭想象吧). 还 ...

  3. 单例模式(Winform窗体的实现)

    在我的设计模式分类当中,我选择单例模式作为我第一个要写的设计模式,其一,单例模式简单.容易理解让人接受,其二,单例模式很常用,在实际的Winform窗体应用开发中能够带来更好的客户体验. 单例模式的核 ...

  4. 【开源】做了一个WinForm窗体的投影组件,能够为窗口添加影子效果

    最近手头上的项目终于忙得差不多了,想起好久没有更新了的NanUI,再看着每天QQ群未读消息闪烁的标志,突然才发现似乎愧对了群里各位喜爱NanUI的朋友们.于是乎,就想趁这几天有时间,好好的修复一下Na ...

  5. winform窗体嵌套HTML页面,开发出炫彩桌面程序

    一:CEF全称Chromium Embedded Framework,是一个基于Google Chromium 的开源项目.Google Chromium项目主要是为Google Chrome应用开发 ...

  6. C# winform窗体间传值(使用委托或事件)

    窗体间传值 今天得空,刚好看到网上好多人再找winform窗体间传值的问题,由于昨天项目的优化的感觉不错,就写了个C# winform窗体间传值的demo,希望能给需要的人的带来帮助: 工程的源代码地 ...

  7. exe程序嵌入Winform窗体

    1.新建winform程序,添加一个Panel控件和一个button控件,winform窗体命名为:Mainform: 2.新建一个类文件,方便引用,命名为:exetowinform: 3.Mainf ...

  8. C# Winform 窗体传值 利用委托 子窗体传值给父窗体

    常用的Winform窗体传值有两种方式. 1.更改Form.designer.cs文件,将控件的设为Public,供子窗体访问. 在designer.cs文件的最后,找到你的控件声明. private ...

  9. C#使用事件方式Winform窗体之间传值

    [摘自:http://www.cnblogs.com/codeToUp/p/5371062.html] 工程的源代码地址:https://github.com/yes-or-no/WinFormTra ...

随机推荐

  1. C++中两个类中互相包含对方对象的指针问题(转载)

    出处:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html // A.h #include "B.h" clas ...

  2. 自定义Web框架与jinja2模板

    web应用与web框架 web应用 对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 import socket def handle_reque ...

  3. openwrt的编译方法

    1.获取最新包 ./scripts/feeds update -a 2.安装包 ./scripts/feeds install -a 3.配置 make menuconfig 4.编译 make -j ...

  4. 分布式系统一致性协议--Paxos算法

    Paxos: Paxos算法背景介绍: Paxos算法是分布式技术大师Lamport提出的,主要目的是通过这个算法,让参与分布式处理的每个参与者逐步达成一致意见.用好理解的方式来说,就是在一个选举过程 ...

  5. 2018 leetcode

    2018-8-6 Lowest Common Ancestor of a Binary Tree(二叉树) Merge Intervals(排序) 2018-8-7 Maximal Square (动 ...

  6. java 从List中随机取出一个元素

    java 从List中随机取出一个元素 List<Integer> list = new ArrayList<>(); Random random = new Random() ...

  7. python 判断字符串是否以数字结尾

    import re def end_num(string): #以一个数字结尾字符串 text = re.compile(r".*[0-9]$") if text.match(st ...

  8. MAC下Java安装之后的路径

    pwd /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home 安装好jdk之后,就开始配置环境变量了. 首先,在终端输入 s ...

  9. spring boot 开发 org.springframework.context.ApplicationContextException: Unable to start web server;

    Error starting ApplicationContext. To display the conditions report re-run your application with 'de ...

  10. 《剑指offer》第二十四题(反转链表)

    // 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...