C#实现电脑锁屏功能的方式

 更新时间:2025年12月07日 08:26:53   作者:yue008  
本文介绍了如何在Winform软件中实现锁屏功能,包括操作界面、锁屏界面和解锁界面的设计,以及使用钩子机制、泛型集合、Process类和Cursor类等技术来实现具体功能,需要的朋友可以参考下

在进行winform软件开发时,需要实现锁屏功能。本文就主要介绍此功能实现方式。

实现思路

  • 此功能分三个界面,分别是操作界面、锁屏界面、解锁界面
  • 操作员在操作界面输入锁屏密码,并启动锁屏功能。锁屏界面显示
  • 解锁时,操作员点击锁屏界面,解锁界面显示,操作员输入解锁密码,锁屏界面关闭,主画面显示

知识点

钩子机制

钩子是Windows操作系统提供的消息处理机制平台,应用程序可通过设置回调函数监视指定窗口消息,钩子可在消息到达目标窗口前捕获键盘、鼠标等输入事件,处理函数可修改消息内容或终止传递流程,可以理解为监视窗口和键盘、鼠标等动作,并根据此动作,执行其他功能,比如屏蔽键盘、记录键盘按下、窗体关闭等。实现代码如下:

 private IntPtr pKeyboardHook = IntPtr.Zero;//键盘钩子句柄
 //钩子委托声明
 public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
 private HookProc KeyboardHookProcedure;//键盘钩子委托实例,不能省略变量
 public const int idHook = 13;//底层键盘钩子
 //安装钩子
 [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
 public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr pInstance, int threadID);
 //卸载钩子
 [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
 public static extern bool UnhookWindowsHookEx(IntPtr pHookHandle);

 //键盘钩子处理函数
 private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
 {
     KeyMSG m = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));//键盘消息处理
     if (pKeyboardHook != IntPtr.Zero)//判断钩子句柄是否为空
     {
         switch (((Keys)m.vkCode))//判断按键
         {
             case Keys.LWin://键盘左侧的Win键
             case Keys.RWin://键盘右侧的Win键
             case Keys.Delete://Delete键
             case Keys.Alt://Alt键
             case Keys.Escape: //Esc键
             case Keys.F4: //F4键
             case Keys.Control://Ctrl键
             case Keys.Tab://Tab键
                 return 1;//不执行任何操作
         }
     }
     return 0;
 }
 //安装钩子方法
 public bool InsertHook()
 {
     IntPtr pIn = (IntPtr)4194304;//将4194304转换为句柄
     if (this.pKeyboardHook == IntPtr.Zero)//不存在钩子时
     {
         //创建钩子
         this.KeyboardHookProcedure = new HookProc(KeyboardHookProc);
         //使用SetWindowsHookEx函数安装钩子
         this.pKeyboardHook = SetWindowsHookEx(idHook, KeyboardHookProcedure, pIn, 0);
         if (this.pKeyboardHook == IntPtr.Zero)//如果安装钩子失败
         {
             this.UnInsertHook();//卸载钩子
             return false;
         }
     }
     return true;
 }
 //卸载钩子方法
 public bool UnInsertHook()
 {
     bool result = true;
     if (this.pKeyboardHook != IntPtr.Zero)//如果存在钩子
     {
         //使用UnhookWindowsHookEx函数卸载钩子
         result = (UnhookWindowsHookEx(this.pKeyboardHook) && result);
         this.pKeyboardHook = IntPtr.Zero;//清空指针
     }
     return result;
 }
 //键盘消息处理结构
 [StructLayout(LayoutKind.Sequential)]
 public struct KeyMSG
 {
     public int vkCode;//键盘按键
 }

泛型集合

List 本功能用到泛型集合,在锁屏功能中作用是将所有的窗体保存到集合中,然后解锁后,全部关闭,避免出现窗体未全部关闭。并且此泛型集合作为全局静态变量。

public static List<Form> listforms = new List<Form>();//窗体集合,主要用来在锁屏及解锁时使用

Process

由于winform是基于windows系统开发的,在锁屏阶段,为避免通过热键等其他方式绕过锁屏功能,需要定时监督windows系统进程,确保在锁屏阶段,windows系统无法执行其他操作。
关于Process,本文只介绍进程的启动和关闭。详细功能可参考官方文档。

using System;
using System.Diagnostics;

class Program
{
static void Main()
{
//启动notepad
Process process = Process.Start("notepad.exe");
System.Threading.Thread.Sleep(2000); // 等待2秒
process.Kill();//关闭notepad
}
}

Cursor

代表用于绘制鼠标指针的图像。
本文主要介绍Cursor的属性Clip:
获取或设置表示光标的剪辑矩形的边界。

Cursor.Clip = new Rectangle(x, y, size.Width, size.Height);//设置鼠标指针的边界

作用主要是当开始解锁时,限制鼠标活动范围只在解锁界面。

size

存储一个有序整数对,用于指定 Height 和 Width。

Cursor.Clip = new Rectangle(x, y, size.Width, size.Height);//设置鼠标指针的边界

窗体数据传送

在进行winform开发时,会需要将数据通过窗体传递,其传递机制为:
假定有窗体A和窗体B,现在需要将窗体A的数据传递给窗体B

  • 在窗体B定义公共变量,tagA和TagB
  • 在窗体A引用窗体B的两个变量,并将数据发送给这两个变量
    其实也可以加载事件。

关键代码

窗体A:锁屏操作界面

 Frm_LScreen Frm_LScreen = new Frm_LScreen();

 private void button1_Click(object sender, EventArgs e)
 {
     if(textBox2.Text.Trim()== ""||textBox3.Text.Trim() =="")
     {
         MessageBox.Show("请输入锁屏密码!", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
         return;
     }
     else
     {
         if(textBox2.Text.Trim()==textBox3.Text.Trim())
         {
             Frm_LScreen.size = this.Size;//
             Frm_LScreen.x = this.Location.X;
             Frm_LScreen.y = this.Location.Y;
             Frm_LScreen.infos = textBox1.Text.Trim();
             Frm_LScreen.pwd = textBox2.Text.Trim();
             this.Hide();
             Operator.listforms.Add(Frm_LScreen);
             Frm_LScreen.ShowDialog();
         }
         else
         {
             MessageBox.Show("输入的两次密码不一致", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
             return;
         }
     }
 }

 private void button2_Click(object sender, EventArgs e)
 {
     this.Close();
 }

 private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
 {
     if(e.KeyChar==13)
     {
         button1.Focus();
     }
 }

窗体2:锁屏界面

  #region  公共变量
  public Size size;//记录窗体的大小
  public int x;
  public int y;
  public string infos;
  public string pwd;
  MyHook myHook=new MyHook ();
  #endregion

  private void Frm_LScreen_Load(object sender, EventArgs e)
  {
      label1.Location = new Point(x, y - 50);
      label1.Text = infos;
      base.Opacity = 0.5;//设置窗体透明度
      myHook.InsertHook();//安装钩子,记录输入锁屏密码
  }

  private void Frm_LScreen_MouseMove(object sender, MouseEventArgs e)
  {
      Cursor.Clip = new Rectangle(x, y, size.Width, size.Height);//设置鼠标指针的边界
  }

  private void Frm_LScreen_MouseClick(object sender, MouseEventArgs e)
  {
      Frm_UnLock frm_UnLock = new Frm_UnLock();
      frm_UnLock.x = x;
      frm_UnLock.y = y;
      frm_UnLock.infos = infos;
      frm_UnLock.pwd = pwd;
      Operator.listforms.Add(frm_UnLock);
      frm_UnLock.ShowDialog();
  }

  private void timer1_Tick(object sender, EventArgs e)
  {
      Process[] processes = Process.GetProcesses();//获取运行的所有进程名
      foreach(Process p in processes)
      {
          try
          {
              if(p.ProcessName.ToLower().Trim()=="taskmgr")
              {
                  p.Kill();//停止进程
                  Cursor.Clip = new Rectangle(x, y, size.Width, size.Height);
                  return;
              }
          }
          catch
          {
              return;
          }
      }
  }

  private void Frm_LScreen_FormClosing(object sender, FormClosingEventArgs e)
  {
      myHook.UnInsertHook();//卸载钩子,解锁屏幕
      timer1.Stop();
  }

窗体3:解锁界面

 #region  公共变量
 public int x;
 public int y;
 public string infos;
 public string pwd;
 #endregion

 private void Frm_UnLock_Load(object sender, EventArgs e)
 {
     this.TopMost = true;
     this.Location=new Point(x, y);
     label1.Text = infos;
 }

 private void button1_Click(object sender, EventArgs e)
 {
     if(textBox1.Text==pwd)
     {
         foreach(Form item in Operator.listforms)
         {
             item.Close();
             item.Dispose();
         }
         this.Close();
     }
     else
     {
         label1.Text = "密码输入错误,请重新输入";
     }
 }

 private void button2_Click(object sender, EventArgs e)
 {
     this.TopMost=false;
     this.Close();
 }

到此这篇关于C#实现电脑锁屏功能的方式的文章就介绍到这了,更多相关C#电脑锁屏功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Unity后处理效果之边角压暗

    Unity后处理效果之边角压暗

    这篇文章主要为大家详细介绍了Unity后处理效果之边角压暗,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • C# 中IRecipient的具体使用

    C# 中IRecipient的具体使用

    IRecipient<TMessage> 是 .NET 中消息传递机制的重要组成部分,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-06-06
  • C#逆变与协变详解

    C#逆变与协变详解

    这篇文章主要为大家详细介绍了C#逆变与协变的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • C#微信开发(服务器配置)

    C#微信开发(服务器配置)

    这篇文章主要介绍了C#微信开发中有关服务器配置的相关内容,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • unity实现流光效果

    unity实现流光效果

    这篇文章主要为大家详细介绍了unity实现流光效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 关于c#二叉树的实现

    关于c#二叉树的实现

    本篇文章小编为大家介绍,关于c#二叉树的实现。需要的朋友参考下
    2013-04-04
  • C#多线程编程中导致死锁的常见陷阱和避免方法

    C#多线程编程中导致死锁的常见陷阱和避免方法

    在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形成一个循环依赖,造成程序无法继续执行,本文将深入探讨C#多线程编程中导致死锁的常见陷阱,并帮助你避免这些坑
    2025-02-02
  • C#实现程序等待延迟执行的方法

    C#实现程序等待延迟执行的方法

    这篇文章主要介绍了C#实现程序等待延迟执行的方法,涉及C#动态链接库的使用及延迟的实现技巧,需要的朋友可以参考下
    2015-09-09
  • C# 7.0 使用下划线忽略使用的变量的原因分析

    C# 7.0 使用下划线忽略使用的变量的原因分析

    这篇文章主要介绍了C# 7.0 使用下划线忽略使用的变量的原因浅析,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10
  • C# 使用HttpClient上传文件并附带其他参数的步骤

    C# 使用HttpClient上传文件并附带其他参数的步骤

    这篇文章主要介绍了C# 使用HttpClient上传文件并附带其他参数的步骤,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12

最新评论