C# Winform 实现屏蔽键盘的win和alt+F4的实现代码

首先,需要在C# Winform程序的窗体类中重载WndProc方法,并且引用System.Windows.Forms命名空间。在WndProc方法中,可以通过重写系统消息 WM_HOTKEY,来监听并屏蔽键盘按键事件,实现屏蔽win和alt+F4的功能。

具体实现步骤如下:

1.引用命名空间 System.Windows.Forms:

using System.Windows.Forms;

2.在窗体类中添加键盘Hook:

public partial class Form1 : Form
{
    private const int WM_HOTKEY = 0x0312;  //定义系统消息的整型值
    private const int MY_HOTKEY_ID = 1;   //定义热键的ID值

    [DllImport("user32.dll")]  //引用系统dll
    public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);

    [DllImport("user32.dll")]  //引用系统dll
    public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

    public Form1()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);

        switch (m.Msg)
        {
            case WM_HOTKEY:
                switch (m.WParam.ToInt32())
                {
                    case MY_HOTKEY_ID:
                        //执行热键事件
                        break;
                    default:
                        break;
                }
                break;
            default:
                break;
        }
    }
}

3.在窗体加载时注册热键,并且在窗体关闭时注销热键:

private void Form1_Load(object sender, EventArgs e)
{
    //注册热键
    RegisterHotKey(this.Handle, MY_HOTKEY_ID, 0, (int)Keys.LWin);  //屏蔽Win键
    RegisterHotKey(this.Handle, MY_HOTKEY_ID, 1, (int)Keys.F4);    //屏蔽Alt + F4键
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    //注销热键
    UnregisterHotKey(this.Handle, MY_HOTKEY_ID);
}

通过上述实现,我们就可以完成屏蔽Win和Alt+F4键的功能。

下面给出一个具体实例来帮助理解:

假设我们的应用程序是一个窗体类Form1,窗体上有一个按钮Button1。我们需要屏蔽Win和Alt+F4键,在窗体中添加代码:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        private const int WM_HOTKEY = 0x0312;  //定义系统消息的整型值
        private const int MY_HOTKEY_ID = 1;   //定义热键的ID值

        [DllImport("user32.dll")]  //引用系统dll
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);

        [DllImport("user32.dll")]  //引用系统dll
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

        public Form1()
        {
            InitializeComponent();
        }

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            switch (m.Msg)
            {
                case WM_HOTKEY:
                    switch (m.WParam.ToInt32())
                    {
                        case MY_HOTKEY_ID:
                            //执行热键事件
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //注册热键
            RegisterHotKey(this.Handle, MY_HOTKEY_ID, 0, (int)Keys.LWin);
            RegisterHotKey(this.Handle, MY_HOTKEY_ID, 1, (int)Keys.F4);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            //注销热键
            UnregisterHotKey(this.Handle, MY_HOTKEY_ID);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Hello World!");
        }
    }
}

在上述代码中,我们注册了两个热键:Win键和Alt+F4键。同时,在窗体的单击事件中添加了一个简单的消息框,用于测试屏蔽功能是否正常。

运行程序后,当用户按下Win键或Alt+F4键时,程序将无法响应,保护了程序不被误操作关闭。当用户单击按钮Button1时,消息框将正常显示,验证了我们的屏蔽功能。

另外一个示例,可以通过重载ProcessCmdKey方法,来在窗体类中屏蔽键盘按键事件。具体实现代码如下:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if ((keyData == Keys.LWin) || ((keyData & Keys.Alt) == Keys.Alt && (keyData & Keys.F4) == Keys.F4))
    {
        return true;  //屏蔽Win键和Alt+F4键
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

通过这种方式,我们也能很方便地实现Win和Alt+F4键的屏蔽功能,并且代码实现也比较简单。需要注意的是,ProcessCmdKey方法只能屏蔽指定的键,无法屏蔽复合键或多个键的组合。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# Winform 实现屏蔽键盘的win和alt+F4的实现代码 - Python技术站

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

相关文章

  • .NET5控制台程序使用EF连接MYSQL数据库的方法

    下面是详细讲解“.NET5控制台程序使用EF连接MYSQL数据库的方法”的完整攻略: 准备工作 确认已经安装.NET5、EF(Core)等必要的环境和工具。 安装Pomelo.EntityFrameworkCore.MySql(用于支持EF连接MYSQL数据库的驱动程序)。 创建控制台程序 使用dotnet命令行工具创建一个新的.NET5控制台程序: dot…

    C# 2023年5月31日
    00
  • LINQ教程之LINQ简介

    LINQ教程之LINQ简介 什么是LINQ 随着计算机技术的飞速发展,数据量的增长以及数据作为应用程序的主要组成部分,如何高效地处理数据成为了软件开发者不可回避的挑战。微软在2007年的时候推出了一项新的技术 – Language Integrated Query,简称LINQ,通过该技术,我们可以在各种数据源(数据库、XML文档、对象集合等)上进行查询和操…

    C# 2023年6月1日
    00
  • C#调用C++ DLL bool返回值始终为true的问题

    以下是详细的攻略: 问题描述 在使用C#调用C++编写的DLL时,可能会遇到bool类型的返回值无法正确返回的问题,始终返回true的情况。 原因分析 bool类型在C++中和C#中所代表的意义不同。在C++中,bool类型值只有0或1,而在C#中,bool类型值对应的是true或false。C#与C++之间的互操作性会导致不同的bool类型值的解释,从而出…

    C# 2023年5月15日
    00
  • asp.net错误处理Application_Error事件示例

    ASP.NET应用程序中的Application_Error事件是用于处理未处理异常的应用程序级别错误的事件。这个事件允许我们将应用程序的控制流引导到自定义错误处理逻辑。下面是完整的“asp.net错误处理Application_Error事件示例”的攻略。 1. 创建Global.asax文件 首先,需要在应用程序的根目录下创建一个名为“Global.as…

    C# 2023年6月6日
    00
  • jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)

    在Web开发中,使用jQuery的Ajax调用后台ASPX文件是一种常见的任务,它可以帮助开发者动态地加载和更新页面内容。在本攻略中,我们将介绍如何使用jQuery的Ajax调用后台ASPX文件,并提供两个示例来说明其用法。 以下是两个示例,介绍如何使用jQuery的Ajax调用后台ASPX文件: 示例一:使用$.ajax方法调用后台ASPX文件 首先,我们…

    C# 2023年5月15日
    00
  • 在C#中使用Channels的完整教程

    在C#中使用Channels的完整教程 什么是Channel? Channel是在C# 7.0版本中引入的一种全新的内置类型,用于在多个awaitable操作之间更方便地进行同步和异步消息传递。 Channel可以看做是一个类似线程安全队列的数据结构,支持读/取操作(receive)和写/存操作(send),并且本身天生具有异步支持(async/await)…

    C# 2023年6月3日
    00
  • C#中如何正确的使用字符串String

    下面是C#中如何正确使用字符串的完整攻略: 1. 创建字符串 在C#中创建字符串最简单的方式就是使用双引号(“”)或单引号(”)将字符括起来: string str1 = "hello"; string str2 = ‘world’; 2. 字符串连接 C#中可以使用”+”运算符来连接两个字符串: string str1 = &quot…

    C# 2023年6月6日
    00
  • C#将数字转换成字节数组的方法

    要将一个数字转换成字节数组,我们可以使用C#中的BitConverter.GetBytes方法。该方法接受一个long,int,short,ulong,uint,ushort,double,float或decimal型式的数字,并将其转换为字节数组。 具体步骤如下: 使用BitConverter.GetBytes方法将数字转换为字节数组。例如: int nu…

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