需求.两个窗体,一个锁屏的,一个输入密码的 ,图片自己看着办
需要的类
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();
}
还有一些不足的地方 键盘热键或者锁定键盘没处理