C# zarządzanie ekranem

0

Witam,
Chciałbym stworzyć funkcję, która jest wywoływana w trakcie działania programu i która na czas działania programu nie pozwala na wygaszenie monitora albo jego przyciemnienie. Moje pytania brzmią następująco:
Czy jest w języku C# jakaś klasa odpowiadająca za ustawienia ekranu w systemie i jeśli tak to jaka to jest klasa oraz jakie parametry odpowiadają za ten element?
Jeżeli nie ma takiej klasy to może jakieś pomysły w jaki sposób to zrobić najprościej?

Z góry dziękuję za pomoc i pozdrawiam

0

Dziękuję za zainteresowanie,
Poradnik oczywiście przydatny i bardzo mi się przyda, ale w poradniku autor podaje 3 parametry:
1 - do zmniejszenia powera
2 - do wyłączenia ekranu
-1 - do włączenia

Problem w tym że nie ma parametru, który by utrzymywał monitor cały cały czas włączony mimo że w systemie jest ustawione wyłączenie np po minucie.
Próbowałem wywołać: SendMessage( this.Handle.ToInt32() , WM_SYSCOMMAND , SC_MONITORPOWER ,-1 ) w pętli ale to nic nie daje i monitor nadal się wygasza.
Jakieś propozycje rozwiązania tego wątku?

0

Tytuł mówi o usypianiu, hibernacji windows, jak możesz pozmieniasz wartości bool czy dobrze przyjrzysz się kodu, to może coś wyłapiesz: http://codehill.com/2009/01/lock-sleep-or-hibernate-windows-using-c/

0

http://www.developerfusion.com/thread/49961/prevent-monitor-standby-and-screensaver-activation/#post-158814

http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/da9554dc-1da8-4648-97a2-351d5656e15c#bdc812fc-93a8-4fa9-b144-b9079d35d222

0

Na jednej stronie podanej przez was znalazłem taką metodę:

private const int WM_SYSCOMMAND = 0x112;
private const int SC_SCREENSAVE = 0xF140;
private const int SC_MONITORPOWER = 0xF170;

protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_SYSCOMMAND:
switch ((int)m.WParam)
{
case SC_MONITORPOWER:
return;
case SC_SCREENSAVE:
return;
}
break;
}

        base.WndProc(ref m);
    }

Problem w tym, że nie za bardzo rozumiem jej działania. Czy ktoś mógłby mi wytłumaczyć co oznaczają dokładnie wartości w hexa przy wm_syscommand, sc_screensave i sc_monitorpower?
Żeby wywołać tą metodę jaki message trzeba podać za parametr?
Dziękuję za pomoc

0

żadnego nie podajesz za parametr - to funkcja obsługi komunikatów winapi. Przez tę funkcję będą przechodzić wszystkie komunikaty z windowsa skierowane do Twojej aplikacji
Te wartości to po prostu identyfikatory tych wiadomości - takie mają zdefiniowane numery porządkowe i tyle - niczego więcej nie musisz wiedzieć - tu masz ich listę
W tej funkcji po prostu przepuszczasz wszystkie komunikaty (base.WndProc()) oprócz komunikatów prośby o zezwolenie na wygaszacz ekranu (SC_SCREENSAVE) i prośby o możliwość wyłączenia monitora (SC_MONITORPOWER) gdzie je ignorujesz po prostu wychodząc z funkcji (przez return)
Oczywiście możesz dodać warunek czy wygaszanie ekranu zostanie dopuszczone czy nie np kodem typu:
if (funkcjaAktywna) return; else break;

Jak chcesz się dowiedzieć więcej to poczytaj o winapi, jak nie - po prostu wklej tę funkcję do programu i będzie robić to co chcesz (nigdzie jej nie wywołujesz samemu).

uwaga - Twoja aplikacja dostanie te komunikaty i będzie mogła je zablokować tylko jeśli będzie aktualnie aktywną aplikacją
tj. jeśli ktoś ją zminimalizuje i będzie robił na komputerze coś innego to Twój program nie będzie mógł w ten sposób zablokować wygaszacza ekranu ani wyłączenia monitora - wtedy musisz zrobić globalnego hooka co jest trochę trudniejsze, wymaga większych przywilejów dla aplikacji i czasami spowoduje że Twoja aplikacja będzie wykrywana przez heurystykę w niektórych antywirusach (bo wtedy masz dostęp do wszystkich komunikatów i między innymi keyloggery działają na tej zasadzie)


ale zapomnij o tym
powinieneś jednak użyć SetThreadExecutionState

0

Dziękuję bardzo @unikalna_nazwa za pomoc. Funkcja spełnia swoją rolę. Co do klasy którą mi poleciłeś też ją przestudiuje :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1