2014-10-11 4 views
-5

Я хочу разработать программу для полного управления Windows и запретить пользователям отключать Windows. Есть ли решение?Возможно ли программно предотвратить закрытие Windows?

Язык программирования не имеет значения.

+8

Пока есть кабель питания, есть способ закрыть Windows ... –

+0

Требуется какое-то оборудование, например. какое-то автоматическое оружие, чтобы убить пользователя и поэтому не позволяйте им тянуть вилку питания. –

+0

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

ответ

3

Самый простой способ сделать это в Windows Forms, C#:

private void Form1_Load(object sender, EventArgs e) 
{ 
    this.FormClosing += Form1_FormClosing; 
} 

void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.WindowsShutDown) 
    { 
     e.Cancel = true; 
    } 
} 

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

Ref .: CloseReason Enumeration

Вы также можете попробовать этот код, который, вероятно, лучше и эффективнее, чем выше код:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.WindowsShutDown) 
    { 
     Process.Start("shutdown", "-a"); 
    } 
} 

Ref .: Cancel a Restart or Shutdown

После Windows Vista Вы не можете блокировать закрыть так же, как это. Попытка сделать это вызовет экран, который спросит вас, что какое-то приложение блокирует закрытие и если вы все равно хотите закрыть или отменить ... Код выше позволит вам заблокировать выключение, но вы не должны полностью блокировать закрытие вниз.

Гораздо лучше, что позволяет даже отображать сообщение в строке экрана, которая отображается, когда закрыта заблокирован, является:

public partial class Form1 : Form 
{ 
    [DllImport("user32.dll")] 
    public extern static bool ShutdownBlockReasonCreate(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)] string pwszReason); 

    private bool blocked = false; 

    protected override void WndProc(ref Message aMessage) 
    { 
     const int WM_QUERYENDSESSION = 0x0011; 
     const int WM_ENDSESSION = 0x0016; 

     if (blocked && (aMessage.Msg == WM_QUERYENDSESSION || aMessage.Msg == WM_ENDSESSION)) 
      return; 

     base.WndProc(ref aMessage); 
    } 

    void Button1_Click(object sender, FormClosingEventArgs e) 
    { 
     if (ShutdownBlockReasonCreate(this.Handle, "DONT:")) 
     { 
      blocked = true; 
      MessageBox.Show("Shutdown blocking succeeded"); 
     } 
     else 
      MessageBox.Show("Shutdown blocking failed"); 
    } 
} 

Ref .: Windows Vista - ShutdownBlockReasonCreate in C#

+1

На самом деле это не ответ. Как вы говорите, для завершения выключения все, что вам нужно сделать, это нажать кнопку «shutdown anyway». Что касается решения, которое не позволяет пользователю отключить систему ... это действительно не одно. –

+1

Asker хочет заблокировать выключение системы, а не закрытие приложения –

+0

Я думаю, что из комментариев на вопрос, что речь идет о выключениях системы, а не о завершении работы приложения. Можете ли вы удалить части ответа, которые не касаются закрытия приложения? –

3

Run gpedit.msc → Конфигурация компьютера → Настройки Windows → Параметры безопасности → Локальные политики → Назначение прав пользователя → Выключить систему

Найти способ переустановки или пользователей из этой групповой политики на выбранном вами языке. Может быть, полезно: Group Policy Settings Reference for Windows and Windows Server.

Смежные вопросы