【问题标题】:c# Lock windows computer on startupc#在启动时锁定windows计算机
【发布时间】:2011-11-10 20:59:50
【问题描述】:

我正在尝试为我的小弟弟编写一个简单的程序。他很多时候都在电脑后面,但他应该在学校学习简单的算术:D

我想做以下程序:

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

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

附: (我的意思不是像windows中的标准机制那样锁定)

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

【问题讨论】:

  • 您可以替换默认外壳...不过,如何做到这一点的问题更适合 SU。
  • 我为我儿子实现了类似的东西,虽然它只是一个巨大的时钟和一个告诉他回去睡觉的消息,所以他不能说他不是早上 5 点。他多大了,电脑水平如何?
  • 他只有 9 岁,对电脑不是很好,所以是的 xD 这可能是非常基础的 :D 你是怎么做到的 kmcc049,我很感兴趣
  • 鲍比 我知道这可能是最安全的方法。但对于这种情况可能有点矫枉过正,不过感谢您的回答:)

标签: c# .net parental-control


【解决方案1】:

您需要某种系统模式对话框(自 win nt 4 以来并未正式支持(出于某些充分的原因)。但是有 this blog 向您展示了如何仍然可以完成相同的事情。

【讨论】:

    【解决方案2】:

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

    首先,创建 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;
    }
    

    请注意:一般来说,偷取注意力是非常糟糕的做法。

    【讨论】:

      【解决方案3】:

      babysmash 的代码中寻找灵感,特别是herehere。这是一个由 Scott Hanselman 编写的婴儿/幼儿应用程序,可以很好地锁定桌面。您可能可以重复使用其中的一些想法。

      【讨论】:

        【解决方案4】:

        我对儿子的解决方案是创建一个巨大的全屏 wpf 应用程序,删除所有工具栏等,并在启动时加载它。由于没有可见的方法来关闭它,他不知道如何关闭它,所以就回去睡觉了。他最终学会了如何绕过它,但它对他有用了一段时间。

        组合起来并不难,如果他试图关闭它,我本可以实施更多策略来抓住他的屏幕输入并阻止它,但在他想出如何获得时不需要这样做周围。

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

        【讨论】:

          【解决方案5】:

          如果你想要快速的东西(虽然我认为 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;
          }
          

          接下来在表单设计器中将FormBorderStyle 设置为None,将WindowState 设置为MaximizedTopMost 设置为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),您可以在系统上留下您可以查找的文件(并相应地责骂他)。取消注释示例中的行以启用此功能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多