2011-01-06 17 views
8

Kilka wyjaśnień: dla projektu, nad którym pracuję, muszę napisać program działający w tle, wykrywa zmiany w plików i przesyła zmodyfikowane pliki do usługi internetowej, aby udostępnić je innym. Całkiem prosta synchronizacja, gdyby nie przypadek, w którym użytkownik modyfikuje duży plik i decyduje się na zamknięcie swojego komputera zaraz po edycji.C# - Jak wykryć zamknięcie/wylogowanie systemu Windows i anulować to działanie (po zapytaniu użytkownika)

Mogę anulować przesyłanie i czekać na kolejny restart, aby przesłać, ale mogę sobie wyobrazić, że użytkownik pobiera plik z internetu na inny komputer następnego ranka i nie rozumie, dlaczego jego zmiany z ubiegłej nocy tam jest.

Więc moim pomysłem było wykrycie, kiedy użytkownicy wylogowują się lub restartują system Windows, a jeśli jestem w trakcie przesyłania, po prostu pytam użytkownika "Wciąż synchronizujemy plik Foo.txt, który właśnie zmieniliście. na pewno chcesz zrestartować? Zmiany nie będą dostępne dla innych, dopóki nie uruchomisz ponownie swojego komputera! ". Jeśli użytkownicy powiedzą "nie", będę musiał zrezygnować z ponownego uruchomienia/wylogowania

Czy to możliwe?

Odpowiedz

8

Jest statyczna klasa nazywa SystemEvents że naraża to zachowanie:

http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx

Jednak nie można rozróżnić pewnych działań i nie wstrzymać time-out strażnika procesu OS. Użyłem go raz, ale domyślny limit czasu skonfigurowany w rejestrze jest trochę krótki, więc prawdopodobnie będzie potrzebny.

Krótko mówiąc, wszystko wydawało się trochę hackowe.

+0

OK, tak myślałem ... Pozwolę wtedy odejść z tego zachowania. Inną moją ideą jest nieustanne przesyłanie postępu w półprzezroczystym oknie. Użytkownicy są następnie informowani o pracy, która dzieje się za sceną i prawdopodobnie nie zostaną w tym przypadku zamknięte. –

+0

@Sebastien szczerze mówiąc, chciałbym spojrzeć na wykonanie usługi, jak Hans zasugerował. Spraw, aby przesyłanie było niezawodne, aby można je było wznowić, i zawijać je w usługę, aby użytkownik nie musiał ponownie uruchamiać go ręcznie. –

+0

To mniej więcej zachowanie, które zamierzałem przyjąć, kiedy powiedziałem: "Puszczę to zachowanie". Chciałem tylko dodać dyskretny postęp przesyłania, aby poinformować użytkownika. Możliwe, że nie będzie to konieczne, jeśli zostaną podane życiorysy. Sądzę, że jestem trochę zaniepokojony pomysłem, że użytkownik wraca do domu ze swoim laptopem i plikami, których kopia zapasowa nie ma w systemie ... –

4

Aby dodać do odpowiedzi @ Adama, jeśli chcesz odróżnić wylogowanie i zamknięcie/ponowne uruchomienie, możesz obsłużyć wiadomość WM_QUERYENDSESSION.

"Shutdown Changes for Windows Vista" to przydatny artykuł do zrozumienia czasu zamknięcia.

+0

dzięki za to. Nie miałem okazji go dodać (musiałem złapać pociąg), ale moja sytuacja polegała na rozróżnianiu między zamknięciem i ponownym uruchomieniem, aby móc wznowić działanie użytkownika, gdy tylko przerwałbym pracę. Nie sądzę, że można je rozróżnić. Wydaje mi się również, że wydarzenia dają ci trochę informacji na temat akcji? –

+0

Klasa "SystemEvents" nie mówi, co się stało; 'WM_QUERYENDSESSION' może tylko wskazać różnicę między wylogowaniem a wyłączeniem lub ponownym uruchomieniem.W systemie Windows nie jest możliwe odróżnienie wyłączenia i ponownego uruchomienia komputera podczas zamykania systemu. –

+0

ah tak. Wczoraj wieczorem znalazłem stary kod i stwierdziłem, że używam tej wiadomości! Na szczęście kod był dowodem koncepcji poprzedniego bossa i nigdy nie ujrzał światła dziennego. –

3

Próba zablokowania wyłączenia jest obecnie szkodliwą propozycją, nie można już tego robić w Vista i wyżej. Monit nie jest czytelny ani osiągalny. Korzystanie z usługi jest bardzo wskazane tutaj, pozwala przetrwać wylogowanie użytkownika. Po ponownym uruchomieniu usługa zostanie automatycznie uruchomiona ponownie, umożliwiając wykonanie zadania.

Powiązane problemy