c# 重载WndProc,实现重写“最小化”的实现方法

yizhihongxing

C#中的WndProc方法是窗体消息处理方法,通过重载WndProc方法可以实现窗体事件处理的功能。在这个方法中,可以处理Windows系统的消息事件,比如最小化、最大化、移动等操作,甚至可以自定义消息事件。下面详细介绍如何通过重载WndProc方法实现重写最小化窗体的实现方法。

第一步:创建一个C#窗体应用程序,打开窗体设计器(Form1.cs),右键单击窗口,选择“查看代码”(View Code)。

第二步:在窗体类中添加重载WndProc方法:

protected override void WndProc(ref Message m)
{
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MINIMIZE = 0xf020;
    // 拦截窗口最小化消息
    if (m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MINIMIZE)
    {
        // 在这里添加处理代码,比如取消最小化、最小化到系统托盘等
        return;
    }
    base.WndProc(ref m);
}

在上面的代码中,我们重载了WndProc方法,添加了参数ref Message m,表示该方法接收系统消息处理,具体的消息在m参数中。在方法中添加了两个常数:WM_SYSCOMMAND表示系统命令消息(值为0x0112),SC_MINIMIZE表示最小化消息(值为0xf020)。在方法中判断当前处理的消息是否为最小化消息,如果是,则可以进行相应的处理。

第三步:在WndProc方法中添加最小化处理代码。比如,可以在该方法中添加以下代码,取消窗体最小化,并将应用程序放到托盘处运行:

private bool isMinimizeToTray = true; // 是否最小化到托盘
protected override void WndProc(ref Message m)
{
    const int WM_SYSCOMMAND = 0x0112;
    const int SC_MINIMIZE = 0xf020;
    if (m.Msg == WM_SYSCOMMAND && m.WParam.ToInt32() == SC_MINIMIZE)
    {
        if (isMinimizeToTray)
        {
            // 取消窗体最小化
            this.WindowState = FormWindowState.Normal;
            // 隐藏窗口并显示系统托盘图标
            this.Visible = false;
            this.notifyIcon.Visible = true;
        }
        else
        {
            // 最小化窗口
            this.WindowState = FormWindowState.Minimized;
        }
        return;
    }
    base.WndProc(ref m);
}

在上面的代码中,我们添加了一个布尔型变量isMinimizeToTray,用于标识窗体最小化后是否要放到系统托盘处运行。首先判断该变量的值,如果为True,则取消窗体最小化并将其隐藏,同时在系统托盘处显示应用程序图标。如果变量isMinimizeToTray为False,则最小化窗口。

第四步:添加系统托盘控件。在窗体设计器中,添加一个NotifyIcon控件,用于在系统托盘处显示应用程序图标。在程序代码中添加以下代码,设置该控件的图标、提示信息等属性:

public Form1()
{
    InitializeComponent();
    // 程序启动后默认最小化到托盘
    minimizeToTrayToolStripMenuItem.Checked = isMinimizeToTray;
    if (isMinimizeToTray)
    {
        this.WindowState = FormWindowState.Minimized;
    }
    // 设置NotifyIcon图标、提示信息等属性
    this.notifyIcon.Icon = this.Icon;
    this.notifyIcon.Text = this.Text;
    this.notifyIcon.BalloonTipTitle = this.Text;
}

第五步:添加系统托盘菜单。在NotifyIcon控件中添加ContextMenu属性,右键单击该属性,在弹出菜单中选择“添加”,添加一个菜单项目minimizeToTrayToolStripMenuItem。在程序代码中添加以下代码,设置该菜单项的文本、单击事件等属性:

private ToolStripMenuItem minimizeToTrayToolStripMenuItem = new ToolStripMenuItem();
// 添加系统托盘菜单
private void AddNotifyIconContextMenu()
{
    ContextMenuStrip contextMenuStrip = new ContextMenuStrip();
    minimizeToTrayToolStripMenuItem.Text = "最小化到托盘";
    minimizeToTrayToolStripMenuItem.Checked = isMinimizeToTray;
    minimizeToTrayToolStripMenuItem.Click += new EventHandler(this.minimizeToTrayToolStripMenuItem_Click);
    contextMenuStrip.Items.Add(minimizeToTrayToolStripMenuItem);
    this.notifyIcon.ContextMenuStrip = contextMenuStrip;
}
// 最小化到托盘菜单项点击事件
private void minimizeToTrayToolStripMenuItem_Click(object sender, EventArgs e)
{
    isMinimizeToTray = !isMinimizeToTray;
    minimizeToTrayToolStripMenuItem.Checked = isMinimizeToTray;
}

在上面的代码中,我们添加了一个ContextMenu属性,并在AddNotifyIconContextMenu方法中设置了菜单项的文本、单击事件等属性。其中,minimizeToTrayToolStripMenuItem_Click方法处理最小化到托盘菜单项的单击事件,通过设置isMinimizeToTray变量的值来实现最小化到托盘的开关。

第六步:运行程序。完成以上操作后,启动程序,单击窗体右上角的最小化按钮,应用程序将最小化到托盘处运行。

第七步:查看完整代码。上面的代码是相对简单的实现,完整代码可以查看如下Gist链接:

https://gist.github.com/wenxuan-xia/af1bdcf04ce651b067a35f1a50daa4b5

在该代码中,我们添加了菜单项的图标、开机启动等功能,以便更好的应用和使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 重载WndProc,实现重写“最小化”的实现方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • asp.net(C#)遍历memcached缓存对象

    首先,我们需要了解一下什么是Memcached。Memcached是一种高速缓存系统,它可以将数据存储在内存中,以提高数据访问速度,可用于减轻关系数据库的压力。而ASP.NET(C#)是一种基于Web的开发技术,用于创建动态、数据驱动的网站和Web应用程序。在ASP.NET(C#)应用程序中使用Memcached缓存系统是一个不错的选择,可以提高应用程序的性…

    C# 2023年5月31日
    00
  • C#异步编程async/await用法详解

    C#异步编程async/await用法详解 异步编程是现代编程语言中的重要特性之一。在C#语言中,我们可以使用async/await关键字实现异步编程。本攻略将会详细讲解C#异步编程async/await用法。 什么是异步编程? 异步编程是指当一个程序执行某个操作时,不必等待该操作完成,而可以在该操作执行的同时继续执行其他操作。在异步编程中,我们可以使用回调…

    C# 2023年5月15日
    00
  • asp.net(C#) 生成随机验证码的代码

    生成随机验证码的代码可以使用C#语言的 .NET Framework提供的Random类和StringBuilder类。下面是示例代码: using System; using System.Text; public static class RandomCode { public static string Generate(int length) { c…

    C# 2023年5月31日
    00
  • C#数据结构之最小堆的实现方法

    C#数据结构之最小堆的实现方法 什么是最小堆? 最小堆是一种特殊的二叉树结构,它满足以下两个条件: 是一个完全二叉树。 任意节点值不大于其子节点的值。 最小堆的根节点是整个堆中最小的元素,而它的左右子节点也必定是整个堆中数值最小的元素。 最小堆的实现 实现最小堆需要用到数组和指针,以下是一个简单的最小堆类。 public class MinHeap<T…

    C# 2023年6月7日
    00
  • C#获取web.config配置文件内容的方法

    以下是关于“C# 获取 web.config 配置文件内容的方法”的完整攻略。 1. 获取 web.config 配置文件的路径 在 C# 中获取 web.config 配置文件的路径有如下两种方法: 方法一:使用 HttpContext string path = HttpContext.Current.Server.MapPath("~/web…

    C# 2023年6月1日
    00
  • CommunityToolkit.Mvvm8.1 MVVM工具包安装引用指南(1)

      本系列文章导航 https://www.cnblogs.com/aierong/category/2297596.html     0.说明 CommunityToolkit.Mvvm包(又名MVVM 工具包,以前名为 Microsoft.Toolkit.Mvvm)是一个现代、快速且模块化的 MVVM 库。它支持:.NET Standard 2.0、 .…

    C# 2023年4月18日
    00
  • C#导出文本内容到word文档的方法

    C#导出文本内容到word文档的方法可以使用Microsoft.Office.Interop.Word组件来实现。以下是具体步骤: 步骤一:安装Microsoft.Office.Interop.Word组件 如果你的电脑上没有安装Microsoft Office,那么就需要手动安装这个组件。在安装这个组件之前,你需要确保已经安装了Microsoft Visu…

    C# 2023年5月15日
    00
  • C#在Unity游戏开发中进行多线程编程的方法

    C#在Unity游戏开发中进行多线程编程的方法 在Unity游戏开发中,多线程编程可以提高游戏性能和可玩性,让游戏更加流畅。而在C#中,我们可以使用Thread类来进行多线程编程。 使用Thread类进行多线程编程 Thread类是.NET中用于创建和管理线程的类。在Unity游戏开发中,我们可以使用它来创建和管理多线程。 创建线程 创建线程有两种方式,一种…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部