我正在尝试为我的小弟弟编写一个简单的程序。他很多时候都在电脑后面,但他应该在学校学习简单的算术:D
我想做以下程序:
- 他启动电脑
- 他需要做一些简单的练习并完成
- 如果他做对了 x 量,他可以继续使用他的电脑。
是否有一种简单的(不需要非常干净的xD)方法来锁定他的计算机,直到我的程序说它可以这样做。
PS(我的意思不是像windows中的标准机制那样锁定)
PPS 它不需要是超高科技,只是普通计算机用户无法通过关闭软件来绕过它:P
我正在尝试为我的小弟弟编写一个简单的程序。他很多时候都在电脑后面,但他应该在学校学习简单的算术:D
我想做以下程序:
是否有一种简单的(不需要非常干净的xD)方法来锁定他的计算机,直到我的程序说它可以这样做。
PS(我的意思不是像windows中的标准机制那样锁定)
PPS 它不需要是超高科技,只是普通计算机用户无法通过关闭软件来绕过它:P
您需要某种系统模式对话框(自 win nt 4 以来并未正式支持(出于某些充分理由)。但是有这个博客向您展示了如何仍然可以完成相同的事情。
如果这仍然相关,那么在不使用任何挂钩的情况下永久锁定计算机的简单方法是执行以下操作:
首先,创建 Form_LostFocus 事件处理程序。这不在属性->事件窗口中,因此您必须以编程方式添加它:
this.LostFocus += new ...
这在 from 失去焦点时调用,因此在这里我们需要将焦点返回给表单:
this.Focus();
this.Activate();
如果然后将焦点放在表单上的控件上,则此方法效果最佳:
textBox1.Focus();
接下来,添加一个定时器,间隔为 100 毫秒,并启用它。这个计时器将检查表单是否有焦点,如果没有,将给它焦点:
// in the Tick Eventhandler
if (!this.Focused)
this.Focus();
这将有效地确保无论您的用户尝试做什么,程序将始终窃取焦点 - 即使他打开任务管理器。
然后让程序全屏显示:将“TopMost”属性设置为 true。将“窗口状态”设置为“最大化”。将“FormBorderStyle”设置为“无”。
最后,处理 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 编写的婴儿/幼儿应用程序,可以很好地锁定桌面。您可能可以重用其中的一些想法。
如果你想要一些快速的东西(虽然我认为 Eddy 和 jeroenh 有高质量的答案)你可以在没有 WinAPI/interop 的情况下做到这一点 - 只需使用窗口技巧。
HasCompletedTasks
首先在你的 上创建一个属性Form
,当他完成测验后将其设置为 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;
}
接下来在表单设计器中设置FormBorderStyle
to None
、WindowState
toMaximized
和TopMost
to True
,或者只是将这段代码粘贴到下面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),您可以在系统上留下您可以查找的文件(并相应地责骂他)。取消注释示例中的行以启用此功能。
我对儿子的解决方案是创建一个巨大的全屏 wpf 应用程序,删除所有工具栏等,并在启动时加载它。由于没有可见的方法来关闭它,他不知道如何关闭它,所以就回去睡觉了。他最终学会了如何绕过它,但它对他有用了一段时间。
组合起来并不难,如果他试图关闭它,我可以实施更多策略来抓住他的屏幕输入并停止它,但在他想出如何绕过它时不需要这样做。
使用全屏 wpf 应用程序,如果您愿意,您应该能够以有趣的格式输出您的数学问题。