在启动时锁定windows计算机



我正在为我的小弟弟写一个简单的程序。他经常坐在电脑后面,但他应该为学校学习简单的算术。D

我想编写如下程序:

  • 他启动了他的电脑
  • 他需要做一些简单的练习完成
  • 如果他做了一个x量的正确,他可以继续使用他的电脑。

是否有一种简单的(不需要非常干净的xD)方法来锁定他的计算机,直到我的程序说它可以这样做。

注:(我不是指windows中标准机制中的锁定)

P.P.S.它不需要是非常高科技的,只要一个普通的计算机用户无法通过关闭软件来绕过它:P

您需要某种系统模态对话框(自winnt 4以来没有正式支持)。然而,这个博客告诉你如何仍然可以完成同样的事情。

如果这仍然是相关的,那么不使用任何钩子而永久锁定计算机的简单方法如下:

首先,创建Form_LostFocus事件处理程序。它不在properties->events窗口中,所以您必须通过编程方式添加它:

this.LostFocus += new ...

当from失去焦点时调用,所以在这里我们需要将焦点还给表单:

this.Focus();
this.Activate();

如果将焦点放在窗体上的控件上,则此方法效果最佳:

textBox1.Focus();

接下来,添加一个间隔为100ms的计时器,并启用它。这个计时器将检查表单是否有焦点,如果没有,将给它焦点:

// in the Tick Eventhandler
if (!this.Focused)
    this.Focus();

这将有效地确保无论你的用户试图做什么,程序总是会窃取焦点-即使他打开任务管理器。

然后让程序全屏:设置'TopMost'属性为true。将'WindowState'设置为' maximized '。将'FormBorderStyle'设置为'None'。

最后,处理Form_Closing事件处理程序。

// Global boolean value - set this to true when 
// the user has completed the set tasks
boolean complete = false;
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (!complete)
        e.cancel = true;
}

请注意:一般来说,窃取焦点是非常糟糕的做法。

在babysmash的代码中寻找灵感,特别是这里和这里。这是一款专为婴幼儿设计的应用,由Scott Hanselman编写,可以很好地锁定桌面。你可以重用其中的一些想法

我给儿子的解决方案是创建一个巨大的全屏wpf应用程序,删除所有工具栏等,并在启动时加载它。因为没有明显的方法可以关闭它,他不知道如何关闭它,所以他只是回到床上。他最终学会了如何绕过它,但这对他来说很有效。

这并不难组合,我本可以执行一些更多的策略来抓住他的屏幕输入并在他试图关闭它时阻止它,但当他想出如何绕过它时,这已经不需要了。

使用全屏wpf应用程序,如果您愿意,您应该能够以有趣的格式输出数学问题。

如果你想要一些快速的东西(尽管我认为Eddy和jeroenh有高质量的答案),你可以不使用WinAPI/interop -只需使用窗口技巧。

首先在你的Form上创建一个属性HasCompletedTasks,当他完成他的测验时将其设置为true:

public bool HasCompletedTasks { get; set; }
public void CompleteAndClose()
{
    //if (File.Exists(_fileName))
    //    File.Delete(_fileName);
    HasCompletedTasks = true;
    Close();
}

现在阻止窗口关闭:

protected override void OnClosing(CancelEventArgs e)
{
    base.OnClosing(e);
    e.Cancel = !HasCompletedTasks;
}

接下来在表单设计器中设置FormBorderStyleNone, WindowStateMaximized, TopMostTrue,或者直接将此代码粘贴在InitializeComponent();下面:

this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.WindowState = FormWindowState.Maximized;
this.TopMost = true;
// const string MonitorFolder = "C:\TasksNotDone";
// Directory.CreateDirectory(MonitorFolder);
// _fileName = Path.Combine(MonitorFolder, DateTime.Now.ToFileTimeUtc().ToString() + ".txt");
// File.WriteAllText(_fileName, DateTime.Now.ToString());

如果你想在他知道如何关闭它(CTRL+ALT+DEL)时得到警告,你可以在系统上留下你可以寻找的文件(并相应地责备他)。取消示例中的行注释以启用此功能。

相关内容

最新更新