我们来比较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, );
}
} #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, );
}
} #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, , , 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 = ;
} /// <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, , , 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, );
}
} #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, );
}
} #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, , , 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 = ;
} /// <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, , , 0x00000002);
}
} #endregion } }

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. poj 3368 Frequent values -Sparse-Table

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16537   Accepted: 5981 Description You ...

  2. 【javascript】数据结构-链表

    // 创建一个链表 function LinkedList(){ // 创建一个Node辅助类,表示需要加入列表的项,它包含一个element属性,即表示需要加入到列表中的值,next属性表示指向下一 ...

  3. Node10.15.0的安装

    1. 首先我们需要去node官网下载最近版本的压缩包,然后我们把他们解压到我们自定义的安装路径,我使用的是/usr/local/lib/nodejs VERSION=v10.15.0 DISTRO=l ...

  4. Asp.net自定义单选复选框控件

    将常用的jquery插件封装成控件也是个不错的选择 下面是效果的简单颜色,由于博客系统的限制没法完整演示最终效果,请下载示例查看 Asp.netWeb APIC#Javascript   1.新建类库 ...

  5. javascript面向对象的一些写法

    因为有闭包,能返回函数,所以针对于面向对象的封装,继承,多态三个特性实现,很舒服. 代码如下: <!DOCTYPE html> <html> <head> < ...

  6. WiscKey: Separating Keys from Values in SSD-Conscious Storage [读后整理]

    WiscKey: Separating Keys from Values in SSD-Conscious Storage WiscKey是一个基于LSM的KV存储引擎,特点是:针对SSD的顺序和随机 ...

  7. python 正则表达式匹配特定浮点数

    def is_decimal(num): import re #以数字开头,小数点后保留1位数字或两位数字或者没有小数部分 dnumre = re.compile(r""" ...

  8. sublime text3 (Mac) 快捷键

    符号说明 符号 说明 ⌘ command ⌃ control ⌥ option ⇧ shift ↩ enter ⌫ delete 打开/关闭/前往 快捷键 功能 ⌘⇧N 打开一个新的sublime窗口 ...

  9. 《剑指offer》第三十三题(二叉搜索树的后序遍历序列)

    // 面试题33:二叉搜索树的后序遍历序列 // 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果. // 如果是则返回true,否则返回false.假设输入的数组的任意两个数字都 ...

  10. 解决Word 2013, Word 2016的保存太慢的问题

    尝试下面步骤: 方法 一:文件〉选项〉高级〉,保存,关闭“允许后台保存”选项. 提示:禁止该项功能可能存在风险, 请及时保存文件. 方法二:禁用 Office  中的硬件加速 1.启动任一 Offic ...