欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用C#實(shí)現(xiàn)Window系統(tǒng)桌面鎖定效果

 更新時(shí)間:2025年05月12日 11:34:45   作者:小碼編匠  
在實(shí)際開發(fā)中,我們有時(shí)需要實(shí)現(xiàn)類似"屏幕鎖定"的效果,C# 作為一門強(qiáng)大的桌面應(yīng)用開發(fā)語言,結(jié)合 Windows API 可以輕松實(shí)現(xiàn)這一功能,所以本文將通過調(diào)用 SetForegroundWindow 和 GetForegroundWindow 兩個(gè)核心方法,實(shí)現(xiàn)一個(gè)簡(jiǎn)易但實(shí)用的屏幕鎖定程序,需要的朋友可以參考下

前言

在實(shí)際開發(fā)中,我們有時(shí)需要實(shí)現(xiàn)類似"屏幕鎖定"的效果,比如用于演示程序、臨時(shí)權(quán)限控制、或者個(gè)人興趣項(xiàng)目。

C# 作為一門強(qiáng)大的桌面應(yīng)用開發(fā)語言,結(jié)合 Windows API 可以輕松實(shí)現(xiàn)這一功能。

本文將通過調(diào)用 SetForegroundWindowGetForegroundWindow 兩個(gè)核心方法,實(shí)現(xiàn)一個(gè)簡(jiǎn)易但實(shí)用的屏幕鎖定程序,并支持輸入正確密碼解鎖。此外,為了提升交互體驗(yàn),還為密碼面板增加了實(shí)時(shí)移動(dòng)動(dòng)畫效果。

功能概述

該程序具備以下核心功能:

1、啟動(dòng)后立即鎖定整個(gè)屏幕,阻止用戶切換到其他應(yīng)用程序;

2、輸入正確密碼(默認(rèn)為 123456)可解除鎖定;

3、密碼輸入框區(qū)域具有動(dòng)態(tài)移動(dòng)效果,增加趣味性和視覺吸引力;

4、界面無邊框、半透明設(shè)計(jì),模擬真實(shí)鎖屏風(fēng)格。

*注意:由于運(yùn)行后無法截圖,因此文中不附運(yùn)行效果圖,建議讀者親自運(yùn)行代碼查看效果。

技術(shù)點(diǎn)

1、獲取與設(shè)置前臺(tái)窗口

我們使用了兩個(gè)重要的 Windows API 方法來實(shí)現(xiàn)窗口強(qiáng)制聚焦功能:

GetForegroundWindow()

作用:獲取當(dāng)前處于前臺(tái)活動(dòng)狀態(tài)的窗口句柄。

返回值類型:IntPtr

[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();

SetForegroundWindow(IntPtr hWnd)

作用:將指定窗口設(shè)為前臺(tái)窗口,并獲得焦點(diǎn)。

參數(shù)說明:hWnd 是目標(biāo)窗口的句柄。

返回值:true 成功;false 失?。ㄈ绱翱诓豢梢娀驒?quán)限不足)

[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);

這兩個(gè)函數(shù)結(jié)合定時(shí)器使用,可以持續(xù)檢測(cè)并強(qiáng)制用戶停留在我們的鎖定窗口上。

2、程序初始化設(shè)置

在窗體加載事件中完成以下配置:

private void FrmLockScreen_Load(object sender, EventArgs e)
{
    this.Activated += FrmLockScreen_Activated;
    this.WindowState = FormWindowState.Maximized; // 全屏顯示
    this.Opacity = 0.5D; // 半透明效果
    this.TopMost = true; // 始終置頂
    this.FormBorderStyle = FormBorderStyle.None; // 無邊框
    this.Location = new Point((Screen.PrimaryScreen.Bounds.Width - 400) / 2,
                              (Screen.PrimaryScreen.Bounds.Height - 300) / 2); // 居中顯示
}

設(shè)置窗體為最大全屏、無邊框、半透明,模擬鎖屏背景;

密碼輸入框居中顯示;

添加回車鍵監(jiān)聽,方便快速解鎖。

3、定時(shí)檢測(cè)并強(qiáng)制切回鎖定窗口

我們使用 System.Timers.Timer 每隔 100ms 檢測(cè)一次當(dāng)前前臺(tái)窗口是否是我們自己的程序,如果不是,則強(qiáng)制切回來:

private void Timer_Tick(object sender, EventArgs e)
{
    this.Invoke(new Action(() =>
    {
        if (GetForegroundWindow() != this.Handle)
        {
            SetForegroundWindow(this.Handle);
        }
    }));
}

這樣可以有效防止用戶通過 Alt+Tab 或點(diǎn)擊任務(wù)欄切換窗口。

4、動(dòng)態(tài)移動(dòng)密碼面板

為了讓界面更有趣味性,我們給密碼面板添加了一個(gè)簡(jiǎn)單的運(yùn)動(dòng)動(dòng)畫:

private void TimerMove_Elapsed(object sender, ElapsedEventArgs e)
{
    panel.Invoke(new Action(() =>
    {
        int newX = panel.Location.X + speedX;
        int newY = panel.Location.Y + speedY;

        // 邊界反彈邏輯
        if (newX <= 0 || newX + panel.Width >= this.ClientSize.Width)
            speedX = -speedX;

        if (newY <= 0 || newY + panel.Height >= this.ClientSize.Height)
            speedY = -speedY;

        panel.Location = new Point(newX, newY);
    }));
}

使用定時(shí)器每 30ms 更新一次位置;

遇到邊界自動(dòng)反彈,形成類似"彈球"效果;

增強(qiáng)視覺吸引力,避免界面過于單調(diào)。

完整代碼示例

以下是完整的窗體類代碼:

public partial class FrmLockScreen : Form
{
    private System.Timers.Timer timer;
    private System.Timers.Timer timerMove;
    private int speedX = 2;
    private int speedY = 1;

    public FrmLockScreen()
    {
        InitializeComponent();
    }

    private void FrmLockScreen_Load(object sender, EventArgs e)
    {
        this.Activated += FrmLockScreen_Activated;
        this.WindowState = FormWindowState.Maximized;
        this.Opacity = 0.5D;
        this.TopMost = true;
        this.FormBorderStyle = FormBorderStyle.None;
        this.Location = new Point(
            (Screen.PrimaryScreen.Bounds.Width - 400) / 2,
            (Screen.PrimaryScreen.Bounds.Height - 300) / 2);

        this.panel.BackColor = SystemColors.Window;
        this.tbx_Password.KeyDown += FrmLockScreen_KeyDown;

        timer = new System.Timers.Timer();
        timer.Interval = 100;
        timer.Elapsed += Timer_Tick;
        timer.Start();

        timerMove = new System.Timers.Timer();
        timerMove.Interval = 30;
        timerMove.Elapsed += TimerMove_Elapsed;
        timerMove.Start();
    }

    private void FrmLockScreen_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            UnlockButton_Click(this, null);
        }
    }

    private void TimerMove_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        panel.Invoke(new Action(() =>
        {
            int newX = panel.Location.X + speedX;
            int newY = panel.Location.Y + speedY;

            if (newX <= 0 || newX + panel.Width >= this.ClientSize.Width)
                speedX = -speedX;

            if (newY <= 0 || newY + panel.Height >= this.ClientSize.Height)
                speedY = -speedY;

            panel.Location = new Point(newX, newY);
        }));
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        this.Invoke(new Action(() =>
        {
            if (GetForegroundWindow() != this.Handle)
            {
                SetForegroundWindow(this.Handle);
            }
        }));
    }

    private void FrmLockScreen_Activated(object sender, EventArgs e)
    {
        SetForegroundWindow(this.Handle);
    }

    private void UnlockButton_Click(object sender, EventArgs e)
    {
        if (tbx_Password.Text == "123456")
        {
            timer.Stop();
            timerMove.Stop();
            this.Close();
        }
        else
        {
            MessageBox.Show("密碼錯(cuò)誤");
        }
    }

    [DllImport("user32.dll")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();
}

總結(jié)

通過本文的學(xué)習(xí),我們掌握了如何利用 C# 結(jié)合 Windows API 來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的屏幕鎖定程序,并通過定時(shí)器機(jī)制保持鎖定狀態(tài),防止用戶切換窗口。

主要知識(shí)點(diǎn)包括:

  • 使用 SetForegroundWindowGetForegroundWindow 控制窗口焦點(diǎn);

  • 利用定時(shí)器實(shí)現(xiàn)動(dòng)態(tài)行為和窗口監(jiān)控;

  • 使用 WinForm 的窗體屬性打造仿系統(tǒng)鎖屏效果;

  • 提供密碼驗(yàn)證機(jī)制增強(qiáng)安全性。

該項(xiàng)目雖然小巧,但涵蓋了多個(gè)實(shí)用技巧,適合作為 C# 初學(xué)者的練手項(xiàng)目,也適合進(jìn)階開發(fā)拓展更多功能,例如:

加入圖形驗(yàn)證碼;

支持多用戶登錄;

更加復(fù)雜的 UI 動(dòng)畫;

日志記錄與錯(cuò)誤提示等。

最后

到此這篇關(guān)于利用C#實(shí)現(xiàn)Window系統(tǒng)桌面鎖定效果的文章就介紹到這了,更多相關(guān)C# Window桌面鎖定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#用Topshelf創(chuàng)建Windows服務(wù)的步驟分享

    C#用Topshelf創(chuàng)建Windows服務(wù)的步驟分享

    這篇文章主要給大家介紹了關(guān)于C#如何利用Topshelf創(chuàng)建Windows服務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Unity3d 如何更改Button的背景色

    Unity3d 如何更改Button的背景色

    這篇文章主要介紹了unity3d GUI.Button 自定義字體大小及透明背景方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#微信公眾號(hào)開發(fā)之服務(wù)器配置

    C#微信公眾號(hào)開發(fā)之服務(wù)器配置

    這篇文章介紹了C#微信公眾號(hào)開發(fā)之服務(wù)器配置,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C#技巧之快速刪除bin和obj文件夾的方法

    C#技巧之快速刪除bin和obj文件夾的方法

    C#程序總會(huì)生成bin和obj文件夾,為了減小源碼的大小,就有必要將這兩個(gè)文件夾刪除,于是想到用批處理文件來刪除
    2013-07-07
  • c# HttpClient設(shè)置超時(shí)的步驟

    c# HttpClient設(shè)置超時(shí)的步驟

    這篇文章主要介紹了c# HttpClient設(shè)置超時(shí)的步驟,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#實(shí)現(xiàn)壓縮HTML代碼的方法

    C#實(shí)現(xiàn)壓縮HTML代碼的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)壓縮HTML代碼的方法,是非常實(shí)用的功能,需要的朋友可以參考下
    2014-09-09
  • C#?使用?Filestream?修改大文件指定位置數(shù)據(jù)

    C#?使用?Filestream?修改大文件指定位置數(shù)據(jù)

    這篇文章主要介紹了C#?使用?Filestream修改大文件指定位置數(shù)據(jù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • C#解決“因?yàn)樗惴ú煌?,客戶端和服?wù)器無法通信”的問題

    C#解決“因?yàn)樗惴ú煌?,客戶端和服?wù)器無法通信”的問題

    實(shí)現(xiàn)微信退款功能,我們需要在微信支付商戶后臺(tái)申請(qǐng)安全證書,并調(diào)用退款A(yù)PI URL,在調(diào)試過程中為增添返回調(diào)試信息屬性,調(diào)試一切正常,但再次覆蓋的時(shí)候,調(diào)用顯示為 “ 因?yàn)樗惴ú煌?客戶端和服務(wù)器無法通信,” ,本文介紹了C#解決因?yàn)樗惴ú煌?客戶端和服務(wù)器無法通信的問題
    2024-12-12
  • C#讀取word中表格數(shù)據(jù)的方法實(shí)現(xiàn)

    C#讀取word中表格數(shù)據(jù)的方法實(shí)現(xiàn)

    本文主要介紹了C#讀取word中表格數(shù)據(jù)的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 解讀C#中ReadString的一些小疑惑

    解讀C#中ReadString的一些小疑惑

    這篇文章主要介紹了關(guān)于C#中ReadString的一些小疑惑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論