2009-03-20 19 views

Odpowiedz

10

Łatwy sposób: Użyj polecenia Process.Start, aby uruchomić plik shutdown.exe.

shutdown /s /t 0 

Programowa sposób: P/Invoke połączenia do ExitWindowsEx

Byłby to P/Invoke Podpis:

[DllImport("aygshell.dll", SetLastError="true")] 
private static extern bool ExitWindowsEx(uint dwFlags, uint dwReserved); 

W każdych okolicznościach, użytkownik działa kod będzie musiał System zamykania przywileje (zwykle nie jest to problem, ale ważny punkt do zapamiętania).

+0

Czy mógłbyś powiedzieć trochę o tym, jak człowiek wybrałby jedną z dwóch metod? Czy jest to po prostu łatwe, czy nie takie łatwe? –

+0

Chciałbym nromally przejść do drugiej opcji w oprogramowaniu produkcyjnym, ponieważ daje większą kontrolę (przyczyny zamykania, itp.). Implementacja zajmuje nieco więcej czasu, ponieważ musiałbym sprawdzić poprawną flagę i podpis. – driis

0

na oko (nietestowanego):

Process.Start("shutdown", "-s -t 0"); 
1

Użyj odmianę "wylogowania użytkownika" kodu pokazanego here.

Ten kod wykorzystuje wywołanie API ExitWindowsEx.

0

Twardy sposób działa na laptopach doskonale, choć zajmuje trochę czasu:

Spawn a couple endless loops in more threads than cpu cores. 
Wait for overheat which will automatically shutdown a computer. 

:)

+0

Tyle spadków! Czy to tylko ja uznałem odpowiedź za zabawną? – Marcel

+0

zabawne, więc +1. Pamiętaj: Wszystkie prace i brak zabawy sprawiają, że Jack jest nudnym chłopcem. –

5

różnymi metodami:

A. System.Diagnostics.Process.Start (” Shutdown "," -s -t 10 ");

B. zarządzania Windows oprzyrządowanie (WMI)

http://www.csharpfriends.com/Forums/ShowPost.aspx?PostID=36953

http://www.dreamincode.net/forums/showtopic33948.htm

C System.Runtime.InteropServices pinvoke

http://bytes.com/groups/net-c/251367-shutdown-my-computer-using-c

D Management System

http://www.geekpedia.com/code36_Shut-down-system-using-Csharp.html

Po przedstawienia, widziałem tak wielu innych również napisali ...

+0

+1 dla opcji i linków –

+0

Chociaż mówię, że wciąż myślę - kiedy osoba nie używa tylko pierwszej opcji? –

+0

Nie jestem pewien, czy ktoś może wyłączyć prawa do wykonywania shutdown.exe, w takim przypadku potrzebny może być kod do wykonania ... – lakshmanaraj

3

WindowsController jest C# klasy otoki wokół ExitWindowsEx.

Czasami trzeba ponownie uruchomić lub zamknięcie systemu operacyjnego z aplikacji (na przykład po instalacji programu). .NET framework oferuje pośrednią sposób, aby ponownie uruchomić komputer za pomocą z Windows Management Instrumentation (WMI) klas w przestrzeni nazw System.Management , jednak nie wydaje się być pewne problemy w ich realizacji.

Dlatego stworzyliśmy klasę WindowsController , którą implementuje niektóre funkcje API do ponownego uruchomienia i zamknięcia systemu Windows na . To obsługuje wszystkie tryby ExitWindowsEx i może również hibernować i zawieszać system w stanie . Ta architektura jest dostępna w wersji C# i VB.NET. Może być skompilowany do modułu .NET lub do biblioteki, która ma być używana z innych języków .NET. Od opiera się na interfejsie API systemu Windows, to nie będzie działać w systemie Linux ani FreeBSD.

(mentalis.org)

0

Można również użyć InitiateSystemShutdown

http://www.pinvoke.net/default.aspx/advapi32.initiatesystemshutdown

using System; 
using System.Runtime.InteropServices; 
using System.Text; 

public class Program 
{ 
    [DllImport("advapi32.dll") ] 
    public static extern bool InitiateSystemShutdown(string MachineName , string Message , uint Timeout , bool AppsClosed , bool Restart); 

    [DllImport("kernel32.dll") ] 
    public static extern uint GetLastError(); 

    [DllImport("kernel32.dll") ] 
    public static extern uint FormatMessage(uint Flags , IntPtr Source , uint MessageID , uint LanguageID , StringBuilder Buffer , uint Size , IntPtr Args); 



    public static void Main() 
    { 
     InitiateSystemShutdown(System.Environment.MachineName, "hello", 0, false, false); 
     //InitiateSystemShutdown("localhost", "hello", 0, false, false); 

    } 
}