C#實現電腦鎖屏功能的方式
在進行winform軟件開發(fā)時,需要實現鎖屏功能。本文就主要介紹此功能實現方式。
實現思路
- 此功能分三個界面,分別是操作界面、鎖屏界面、解鎖界面
- 操作員在操作界面輸入鎖屏密碼,并啟動鎖屏功能。鎖屏界面顯示
- 解鎖時,操作員點擊鎖屏界面,解鎖界面顯示,操作員輸入解鎖密碼,鎖屏界面關閉,主畫面顯示
知識點
鉤子機制
鉤子是Windows操作系統提供的消息處理機制平臺,應用程序可通過設置回調函數監(jiān)視指定窗口消息,鉤子可在消息到達目標窗口前捕獲鍵盤、鼠標等輸入事件,處理函數可修改消息內容或終止傳遞流程,可以理解為監(jiān)視窗口和鍵盤、鼠標等動作,并根據此動作,執(zhí)行其他功能,比如屏蔽鍵盤、記錄鍵盤按下、窗體關閉等。實現代碼如下:
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;//不執(zhí)行任何操作
}
}
return 0;
}
//安裝鉤子方法
public bool InsertHook()
{
IntPtr pIn = (IntPtr)4194304;//將4194304轉換為句柄
if (this.pKeyboardHook == IntPtr.Zero)//不存在鉤子時
{
//創(chuàng)建鉤子
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 本功能用到泛型集合,在鎖屏功能中作用是將所有的窗體保存到集合中,然后解鎖后,全部關閉,避免出現窗體未全部關閉。并且此泛型集合作為全局靜態(tài)變量。
public static List<Form> listforms = new List<Form>();//窗體集合,主要用來在鎖屏及解鎖時使用
Process
由于winform是基于windows系統開發(fā)的,在鎖屏階段,為避免通過熱鍵等其他方式繞過鎖屏功能,需要定時監(jiān)督windows系統進程,確保在鎖屏階段,windows系統無法執(zhí)行其他操作。
關于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開發(fā)時,會需要將數據通過窗體傳遞,其傳遞機制為:
假定有窗體A和窗體B,現在需要將窗體A的數據傳遞給窗體B
- 在窗體B定義公共變量,tagA和TagB
- 在窗體A引用窗體B的兩個變量,并將數據發(fā)送給這兩個變量
其實也可以加載事件。
關鍵代碼
窗體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#電腦鎖屏功能內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

