it编程 > 编程语言 > Asp.net

利用C#实现Window系统桌面锁定效果

31人参与 2025-05-12 Asp.net

前言

在实际开发中,我们有时需要实现类似"屏幕锁定"的效果,比如用于演示程序、临时权限控制、或者个人兴趣项目。

c# 作为一门强大的桌面应用开发语言,结合 windows api 可以轻松实现这一功能。

本文将通过调用 setforegroundwindowgetforegroundwindow 两个核心方法,实现一个简易但实用的屏幕锁定程序,并支持输入正确密码解锁。此外,为了提升交互体验,还为密码面板增加了实时移动动画效果。

功能概述

该程序具备以下核心功能:

1、启动后立即锁定整个屏幕,阻止用户切换到其他应用程序;

2、输入正确密码(默认为 123456)可解除锁定;

3、密码输入框区域具有动态移动效果,增加趣味性和视觉吸引力;

4、界面无边框、半透明设计,模拟真实锁屏风格。

*注意:由于运行后无法截图,因此文中不附运行效果图,建议读者亲自运行代码查看效果。

技术点

1、获取与设置前台窗口

我们使用了两个重要的 windows api 方法来实现窗口强制聚焦功能:

getforegroundwindow()

作用:获取当前处于前台活动状态的窗口句柄。

返回值类型:intptr

[dllimport("user32.dll")]
private static extern intptr getforegroundwindow();

setforegroundwindow(intptr hwnd)

作用:将指定窗口设为前台窗口,并获得焦点。

参数说明:hwnd 是目标窗口的句柄。

返回值:true 成功;false 失败(如窗口不可见或权限不足)

[dllimport("user32.dll")]
private static extern bool setforegroundwindow(intptr hwnd);

这两个函数结合定时器使用,可以持续检测并强制用户停留在我们的锁定窗口上。

2、程序初始化设置

在窗体加载事件中完成以下配置:

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); // 居中显示
}

设置窗体为最大全屏、无边框、半透明,模拟锁屏背景;

密码输入框居中显示;

添加回车键监听,方便快速解锁。

3、定时检测并强制切回锁定窗口

我们使用 system.timers.timer 每隔 100ms 检测一次当前前台窗口是否是我们自己的程序,如果不是,则强制切回来:

private void timer_tick(object sender, eventargs e)
{
    this.invoke(new action(() =>
    {
        if (getforegroundwindow() != this.handle)
        {
            setforegroundwindow(this.handle);
        }
    }));
}

这样可以有效防止用户通过 alt+tab 或点击任务栏切换窗口。

4、动态移动密码面板

为了让界面更有趣味性,我们给密码面板添加了一个简单的运动动画:

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);
    }));
}

使用定时器每 30ms 更新一次位置;

遇到边界自动反弹,形成类似"弹球"效果;

增强视觉吸引力,避免界面过于单调。

完整代码示例

以下是完整的窗体类代码:

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("密码错误");
        }
    }

    [dllimport("user32.dll")]
    private static extern bool setforegroundwindow(intptr hwnd);

    [dllimport("user32.dll")]
    private static extern intptr getforegroundwindow();
}

总结

通过本文的学习,我们掌握了如何利用 c# 结合 windows api 来实现一个简单的屏幕锁定程序,并通过定时器机制保持锁定状态,防止用户切换窗口。

主要知识点包括:

该项目虽然小巧,但涵盖了多个实用技巧,适合作为 c# 初学者的练手项目,也适合进阶开发拓展更多功能,例如:

加入图形验证码;

支持多用户登录;

更加复杂的 ui 动画;

日志记录与错误提示等。

最后

到此这篇关于利用c#实现window系统桌面锁定效果的文章就介绍到这了,更多相关c# window桌面锁定内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

基于C#实现Windows桌面截图功能

05-12

C#窗体中Control以及Invalidate,Update,Refresh三种重绘方法的区别及说明

05-14

C#中的WPF基本概念详解

05-14

通过C#获取Excel单元格的数据类型的方法详解

05-11

C#特性(Attributes)和反射(Reflection)详解

05-14

C# log4net 的配置文件配置项详细介绍(配置示例)

05-09

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论