页首Html代码

winform 实现锁屏功能

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

 

posted @ 2025-04-07 15:29  noigel  阅读(54)  评论(0)    收藏  举报
js脚本