using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace PreSaleDemo
{
public partial class LockForm : Form
{
public LockForm()
{
InitializeComponent();
init();
}
private void init()
{
this.Text = "自定义锁屏演示";
this.Size = new Size(400, 200);
this.StartPosition = FormStartPosition.CenterScreen;
Button lockButton = new Button();
lockButton.Text = "锁定屏幕";
lockButton.Size = new Size(120, 40);
lockButton.Location = new Point(
(this.ClientSize.Width - lockButton.Width) / 2,
(this.ClientSize.Height - lockButton.Height) / 2);
lockButton.Click += LockButton_Click;
this.Controls.Add(lockButton);
}
private void LockButton_Click(object sender, EventArgs e)
{
// 创建并显示锁屏窗体
LockScreenForm lockScreen = new LockScreenForm();
lockScreen.Show();
}
}
public class LockScreenForm : Form
{
private TextBox passwordTextBox;
private Button unlockButton;
private Label promptLabel;
private Label errorLabel;
private Panel loginPanel;
// 获取当前登录用户名
private string currentUserName = Environment.UserName;
public LockScreenForm()
{
InitializeForm();
}
private void InitializeForm()
{
// 设置窗体属性
this.FormBorderStyle = FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
this.TopMost = true;
this.ShowInTaskbar = false;
// 半透明深色背景
this.BackColor = Color.Black;
this.Opacity = 0.85;
// 捕获所有键盘事件
this.KeyPreview = true;
this.KeyDown += LockScreenForm_KeyDown;
// 创建登录面板
CreateLoginPanel();
// 阻止Alt+Tab和其他系统热键
this.Load += (s, e) => CaptureKeys();
this.FormClosed += (s, e) => ReleaseKeys();
}
private void CreateLoginPanel()
{
// 创建一个白色面板用于密码输入
loginPanel = new Panel();
loginPanel.Size = new Size(350, 250);
loginPanel.BackColor = Color.White;
loginPanel.BorderStyle = BorderStyle.FixedSingle;
// 计算面板位置(屏幕中央)
int x = (Screen.PrimaryScreen.Bounds.Width - loginPanel.Width) / 2;
int y = (Screen.PrimaryScreen.Bounds.Height - loginPanel.Height) / 2;
loginPanel.Location = new Point(x, y);
// 创建标题标签
Label titleLabel = new Label();
titleLabel.Text = "计算机已锁定";
titleLabel.Font = new Font("Microsoft YaHei UI", 14, FontStyle.Bold);
titleLabel.Size = new Size(300, 30);
titleLabel.TextAlign = ContentAlignment.MiddleCenter;
titleLabel.Location = new Point(25, 20);
// 创建用户名标签
Label userLabel = new Label();
userLabel.Text = $"用户: {currentUserName}";
userLabel.Font = new Font("Microsoft YaHei UI", 10);
userLabel.Size = new Size(300, 25);
userLabel.Location = new Point(25, 60);
// 创建提示标签
promptLabel = new Label();
promptLabel.Text = "请输入Windows密码解锁:";
promptLabel.Font = new Font("Microsoft YaHei UI", 10);
promptLabel.Size = new Size(300, 25);
promptLabel.Location = new Point(25, 95);
// 创建密码输入框
passwordTextBox = new TextBox();
passwordTextBox.PasswordChar = '●';
passwordTextBox.Size = new Size(300, 25);
passwordTextBox.Location = new Point(25, 120);
passwordTextBox.KeyDown += (s, e) => { if (e.KeyCode == Keys.Enter) AttemptUnlock(); };
// 创建解锁按钮
unlockButton = new Button();
unlockButton.Text = "解锁";
unlockButton.Size = new Size(100, 30);
unlockButton.Location = new Point(125, 160);
unlockButton.Click += (s, e) => AttemptUnlock();
// 创建错误信息标签
errorLabel = new Label();
errorLabel.Text = "";
errorLabel.ForeColor = Color.Red;
errorLabel.Font = new Font("Microsoft YaHei UI", 9);
errorLabel.Size = new Size(300, 20);
errorLabel.TextAlign = ContentAlignment.MiddleCenter;
errorLabel.Location = new Point(25, 200);
// 将控件添加到面板
loginPanel.Controls.Add(titleLabel);
loginPanel.Controls.Add(userLabel);
loginPanel.Controls.Add(promptLabel);
loginPanel.Controls.Add(passwordTextBox);
loginPanel.Controls.Add(unlockButton);
loginPanel.Controls.Add(errorLabel);
// 将面板添加到窗体
this.Controls.Add(loginPanel);
// 设置面板的Z顺序,确保它在顶部
loginPanel.BringToFront();
}
private void AttemptUnlock()
{
string password = passwordTextBox.Text;
if (string.IsNullOrEmpty(password))
{
errorLabel.Text = "请输入密码";
return;
}
if (ValidateWindowsPassword(currentUserName, password))
{
// 验证成功,关闭锁屏
this.Close();
}
else
{
// 验证失败
errorLabel.Text = "密码不正确,请重试";
passwordTextBox.Text = "";
passwordTextBox.Focus();
}
}
// 验证Windows账户密码
private bool ValidateWindowsPassword(string username, string password)
{
// 使用P/Invoke调用LogonUser API
const int LOGON32_LOGON_INTERACTIVE = 2;
const int LOGON32_PROVIDER_DEFAULT = 0;
IntPtr tokenHandle = IntPtr.Zero;
bool success = LogonUser(
username,
Environment.UserDomainName,
password,
LOGON32_LOGON_INTERACTIVE,
LOGON32_PROVIDER_DEFAULT,
out tokenHandle);
if (tokenHandle != IntPtr.Zero)
{
CloseHandle(tokenHandle);
}
return success;
}
// Win32 API 导入
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern bool LogonUser(
string lpszUsername,
string lpszDomain,
string lpszPassword,
int dwLogonType,
int dwLogonProvider,
out IntPtr phToken);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
private static extern bool CloseHandle(IntPtr handle);
// 处理键盘事件
private void LockScreenForm_KeyDown(object sender, KeyEventArgs e)
{
// 阻止Alt+F4
if (e.Alt && e.KeyCode == Keys.F4)
{
e.Handled = true;
}
// 阻止Ctrl+Alt+Delete无法在此处处理,需要系统级钩子
// 阻止Windows键
if (e.KeyCode == Keys.LWin || e.KeyCode == Keys.RWin)
{
e.Handled = true;
}
}
//#region 捕获系统键盘事件
// 低级键盘钩子常量和结构
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private const int WM_SYSKEYDOWN = 0x0104;
private static IntPtr hookId = IntPtr.Zero;
private static LowLevelKeyboardProc keyboardProc;
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
private void CaptureKeys()
{
keyboardProc = HookCallback;
hookId = SetLowLevelKeyboardHook(keyboardProc);
}
private void ReleaseKeys()
{
if (hookId != IntPtr.Zero)
{
UnhookWindowsHookEx(hookId);
hookId = IntPtr.Zero;
}
}
private static IntPtr SetLowLevelKeyboardHook(LowLevelKeyboardProc proc)
{
using (var curProcess = System.Diagnostics.Process.GetCurrentProcess())
using (var curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
}
}
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && (wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN))
{
int vkCode = Marshal.ReadInt32(lParam);
// 阻止Alt+Tab, Alt+Esc, Ctrl+Esc, Windows键
if ((Control.ModifierKeys & Keys.Alt) != 0 &&
(vkCode == (int)Keys.Tab || vkCode == (int)Keys.Escape))
{
return (IntPtr)1;
}
if ((Control.ModifierKeys & Keys.Control) != 0 && vkCode == (int)Keys.Escape)
{
return (IntPtr)1;
}
if (vkCode == (int)Keys.LWin || vkCode == (int)Keys.RWin)
{
return (IntPtr)1;
}
}
return CallNextHookEx(hookId, nCode, wParam, lParam);
}
}
}
//#endregion