c # Блокировка компьютера Windows при запуске - PullRequest
3 голосов
/ 06 сентября 2011

Я пытаюсь написать простую программу для моего младшего брата.Он много раз за компьютером, но ему нужно учить простую арифметику для школы: D

Я хочу создать следующую программу:

  • Он запускает свой компьютер
  • Ему нужно выполнить несколько простых упражнений и выполнить
  • Если он правильно сделал сумму x, он может продолжать пользоваться своим компьютером.

Есть ли простое (этоне нужно быть очень чистым xD) способ блокировки его компьютера, пока моя программа не скажет, что это возможно.

PS (я не имею в виду блокировку, как в стандартном механизме в windows)

PPS Это не должно быть сверхвысокой технологией, просто обычный пользователь компьютера не может обойти это, закрыв программное обеспечение: P

Ответы [ 5 ]

2 голосов
/ 08 мая 2012

Если это все еще актуально, тогда простой способ навсегда заблокировать компьютер без использования хуков состоит в следующем:

Сначала создайте обработчик событий Form_LostFocus.Это не в окне свойств-> событий, поэтому вам придется добавить его программно:

this.LostFocus += new ...

Это вызывается, когда объект from теряет фокус, поэтому здесь нам нужно вернуть фокус обратноформа:

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

Этот метод работает лучше всего, если затем фокусируется на элементе управления в форме:

textBox1.Focus();

Затем добавьте таймер с интервалом 100 мс ивключить его.Этот таймер проверит, находится ли форма в фокусе, а если нет, даст ей фокус:

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

Это будет эффективно гарантировать, что независимо от того, что ваш пользователь пытается сделать, программа всегда будет красть фокус - дажеесли он открывает диспетчер задач.

Затем просто сделайте программу полноэкранной: установите для свойства TopMost значение true.Установите «WindowState» на «развернутый».Установите для 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;
}

Обратите внимание: В общем, кража фокуса крайне плохая практика.

2 голосов
/ 06 сентября 2011

Вам нужен какой-то системный модальный диалог (формально не поддерживаемый с win nt 4 (по ряду веских причин). Однако есть этот блог , который показывает вам, как вы можете сделать то же самоевещь.

1 голос
/ 06 сентября 2011

Ищите вдохновение в коде для babysmash , в частности здесь и здесь . Это приложение для детей / малышей, написанное Скоттом Хансельманом, которое довольно хорошо блокирует рабочий стол. Вы, вероятно, можете использовать некоторые идеи там.

0 голосов
/ 06 сентября 2011

Если вы хотите что-то быстрое (хотя я думаю, что у Eddy и jeroenh есть качественные ответы), вы можете сделать это без WinAPI / взаимодействия - просто используйте хитрости окна.

Сначала создайте свойство 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 вNone, от WindowState до Maximized и TopMost до 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), вы можете оставить в системе файлы, которые вы можете искать (и соответственно ругать его).Раскомментируйте строки в примерах, чтобы включить это.

0 голосов
/ 06 сентября 2011

Моим решением для моего сына было создание гигантского полноэкранного wpf-приложения со всеми удаленными панелями инструментов и т. Д. И его загрузка при запуске. Поскольку не было видимого способа закрыть его, он понятия не имел, как его закрыть, поэтому просто вернулся бы в кровать. В конце концов он научился обходить его, но это сработало для него довольно долго.

Это было не очень сложно собрать, и я мог бы применить еще несколько тактик, чтобы захватить его экранный ввод и остановить его, если он попытался закрыть его, но это было не нужно к тому времени, когда он понял, как получить вокруг него.

С полноэкранным wpf-приложением вы сможете вывести свои математические вопросы в интересном формате, если хотите.

...