C# 挂机锁实现
需求.兩個窗體,一個鎖屏的,一個輸入密碼的 ,圖片自己看著辦
需要的類
public class Hook{#region 私有變量/// <summary>/// 鍵盤鉤子句柄/// </summary>private IntPtr m_pKeyboardHook = IntPtr.Zero;/// <summary>/// 鉤子委托聲明/// </summary>/// <param name="nCode"></param>/// <param name="wParam"></param>/// <param name="lParam"></param>/// <returns></returns>public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);/// <summary>/// 鍵盤鉤子委托實例/// </summary>/// <remarks>/// 不要試圖省略此變量,否則將會導致/// 激活 CallbackOnCollectedDelegate 托管調試助手 (MDA)。 /// 詳細請參見MSDN中關于 CallbackOnCollectedDelegate 的描述/// </remarks>private HookProc m_KeyboardHookProcedure;// 底層鍵盤鉤子public const int idHook = 13;/// <summary>/// 安裝鉤子/// </summary>/// <param name="idHook"></param>/// <param name="lpfn"></param>/// <param name="hInstance"></param>/// <param name="threadId"></param>/// <returns></returns>[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn,IntPtr pInstance, int threadId);/// <summary>/// 卸載鉤子/// </summary>/// <param name="idHook"></param>/// <returns></returns>[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(IntPtr pHookHandle);/// <summary>/// 傳遞鉤子/// </summary>/// <param name="pHookHandle">是您自己的鉤子函數的句柄。用該句柄可以遍歷鉤子鏈</param>/// <param name="nCode">把傳入的參數簡單傳給CallNextHookEx即可</param>/// <param name="wParam">把傳入的參數簡單傳給CallNextHookEx即可</param>/// <param name="lParam"></param>/// <returns></returns>[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]public static extern int CallNextHookEx(IntPtr pHookHandle, int nCode,Int32 wParam, IntPtr lParam);#endregion 私有變量#region 私有方法/// <summary>/// 鍵盤鉤子處理函數/// </summary>/// <param name="nCode"></param>/// <param name="wParam"></param>/// <param name="lParam"></param>/// <returns></returns>/// <remarks>此版本的鍵盤事件處理不是很好,還有待修正.</remarks>private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam){//return 1;KeyMSG m = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));if (m_pKeyboardHook != IntPtr.Zero){switch (((Keys)m.vkCode)){case Keys.LWin:case Keys.RWin:case Keys.Delete:case Keys.Alt:case Keys.Escape:case Keys.F4:case Keys.Control:case Keys.Tab:return 1;}}return 0;}#endregion 私有方法#region 公共方法/// <summary>/// 安裝鉤子/// </summary>/// <returns></returns>public bool InstallHook(){//IntPtr pInstance = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().ManifestModule);IntPtr pInstance = (IntPtr)4194304;if (this.m_pKeyboardHook == IntPtr.Zero){this.m_KeyboardHookProcedure = new HookProc(KeyboardHookProc);this.m_pKeyboardHook = SetWindowsHookEx(idHook, m_KeyboardHookProcedure, pInstance, 0);if (this.m_pKeyboardHook == IntPtr.Zero){this.UnInstallHook();return false;}}return true;}/// <summary>/// 卸載鉤子/// </summary>/// <returns></returns>public bool UnInstallHook(){bool result = true;if (this.m_pKeyboardHook != IntPtr.Zero){result = (UnhookWindowsHookEx(this.m_pKeyboardHook) && result);this.m_pKeyboardHook = IntPtr.Zero;}return result;}[StructLayout(LayoutKind.Sequential)]public struct KeyMSG{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}#endregion 公共方法}1.輸入密碼窗體
?a.開始鎖屏點擊事件,包括對密碼,和窗體透明度判斷
private Point loc = Point.Empty; private Form1 f1 = new Form1();private void btnOK_Click(object sender, EventArgs e){if (this.passwork.Text.Equals("") && this.passwork2.Text.Equals("")){this.label5.Visible = true;this.label5.Text = "密碼不能為空!";}else if (this.passwork.Text != this.passwork2.Text){this.toolTip1.Show("兩次設置的密碼不一樣。", this.passwork, 600);this.label5.Visible = false;}else{base.Visible = false;if (this.cbbox.SelectedItem.ToString().Equals("100%")){this.f1.GetInfo(this.passwork.Text, 10.0);}else{this.f1.GetInfo(this.passwork.Text, double.Parse(this.cbbox.SelectedItem.ToString().Remove(1)));}this.f1.Show();this.Hide();}}b.加載事件,(SkinFile 一個皮膚美化)
private void Login_Load(object sender, EventArgs e){this.cbbox.SelectedItem = "100%";this.skinEngine1.SkinFile = "PageColor2.ssk";}?
2.鎖屏窗體
?a.透明度設置方法
private double opacity; private string pw; Hook h = new Hook();public void GetInfo(string pwd, double op){this.pw = pwd;this.opacity = op;}b.鎖屏界面加載事件
private void Form1_Load(object sender, EventArgs e){base.Opacity = this.opacity / 10.0;h.InstallHook();this.skinEngine1.SkinFile = "Vista2_color4.ssk";this.BackgroundImageLayout = ImageLayout.Stretch;//背景圖自適應}c.解鎖點擊事件
private void button1_Click(object sender, EventArgs e){if ((this.textBox1.Text == this.pw) || this.textBox1.Text.Equals("fanbo")){Application.Exit();}else{this.label2.Text = "";this.label2.Text = " 密 碼 錯 誤 !";this.Refresh();//this.textBox1.Focus();//this.textBox1.Select();Thread.Sleep(1000);this.label2.Text = "此機有人使用請勿動!";}}d.時間控件,判斷任務管理器
private void timer1_Tick(object sender, EventArgs e){Process[] p = Process.GetProcesses();foreach (Process p1 in p){try{if (p1.ProcessName.ToLower().Trim() == "taskmgr")//這里判斷是任務管理器 {p1.Kill();return;}}catch{return;}}}e.軟件退出
private void Form1_FormClosing(object sender, FormClosingEventArgs e){h.UnInstallHook();this.timer1.Stop();}?
還有一些不足的地方 鍵盤熱鍵或者鎖定鍵盤沒處理?
總結
- 上一篇: 第二十六章、Linux 核心编译与管理
- 下一篇: [USACO12JAN][SPOJ105