2010-09-08 9 views
12

W programie C++ uruchomionym na Win7, czy istnieje sposób na sfałszowanie ruchu myszy lub coś w tym stylu, tylko po to, aby wygaszacz ekranu nie został uruchomiony, a system nie przeszedł w stan uśpienia? Szukam minimalnego podejścia i wolę nie używać .NET. Dzięki, -niedzielaJak mogę zapobiec wygaszaczom ekranu i zasypianiu podczas wykonywania mojego programu?

+2

dlaczego nie zmieniasz ustawienia wygaszacza ekranu ani ustawienia zasilania systemu? –

+1

Jako użytkownik twojego programu _I_ chcę sam zdecydować, czy chcę, aby wykonanie jakiegoś programu zostało spowolnione przez niektóre wygaszacze ekranu. Jeśli jesteś swoim własnym użytkownikiem, zawsze możesz zmienić ustawienia systemu samodzielnie. – sbi

+4

Właściwie to jest poprawne pytanie. Wydaje mi się, że Windows Media Player robi to podczas odtwarzania wideo, a następnie jest uzasadniony (nie chcesz stać co pięć minut i przesuwać myszy tylko po to, aby cieszyć się swoim filmem, nie wyłączając również wygaszacza ekranu tylko po to, aby obejrzeć film jest przesadny). – Tomek

Odpowiedz

29

Nie zadzieraj z ustawieniami wygaszacza ekranu, użyj SetThreadExecutionState. Jest to API do informowania okien na fakt, że aplikacja jest aktywny:

umożliwia aplikacji do poinformowania systemu z że jest w użyciu, co zapobiegając system przed wejściem snu lub wyłączenie wyświetlacza podczas gdy aplikacja jest uruchomiona.

i

aplikacje multimedialne, takie jak wideo graczy i zastosowań prezentacyjnych, musi używać ES_DISPLAY_REQUIRED kiedy wyświetlania wideo na długie okresy czasu bez interwencji użytkownika

+0

Funkcja SetThreadExecutionState() doskonale nadaje się do kontrolowania systemu i wyświetlania stanu uśpienia, ale * nie * zapobiega uruchamianiu wygaszacza ekranu. Przynajmniej funkcja doc mówi, że tak nie będzie. – naor

+4

Korekta: chociaż strona MSDN dla tej funkcji stwierdza, że ​​"Ta funkcja nie zatrzymuje wykonywania wygaszacza ekranu." Wywołanie z ES_DISPLAY_REQUIRED w rzeczywistości uniemożliwia uruchomienie wygaszacza ekranu. – naor

+3

jest to również sposób na przejście (przez p/invoke), jeśli używasz .NET - http://pinvoke.net/default.aspx/kernel32.SetThreadExecutionState –

-2

Nie jestem pewien, dlaczego musisz się do tego odwołać. Proste wyłączenie tych opcji w ustawieniach zasilania zrobi.

Co próbujesz osiągnąć, robiąc to. Czy twoja aplikacja jest usługą. Jeśli tak jest, nie musisz się tym martwić.

Jeśli twoja aplikacja jest aplikacją interfejsu użytkownika, również nie mogę myśleć o ważnym przypadku użycia.

W każdym razie potrzebujemy więcej informacji.

+0

Powiedz, że jest to długie autoodtwarzanie do grania w grę, w której wprowadzanie użytkownika nie jest wymagane, nie chcesz, aby wygaszacz ekranu przeszkadzał użytkownikowi – gldraphael

0

Zazwyczaj jest to szczególnie pomysł zły. Pulpit należy do użytkownika aplikacji, , a nie.

Jeśli uruchomiłem aplikację, która wyłączyła mój wygaszacz ekranu (lub poruszałem się po ikonach na pulpicie lub dodałem się do moich różnych pasków narzędzi szybkiego dostępu) bez mojej zgody, to zostanie ono rzucone całkiem szybko na ucho.

A jeśli jesteś użytkownik, , nie zrób to w swojej aplikacji. Zmienić go ręcznie jak reszta z nas :-)

Jeśli musi zrobić (i zachęcam, aby nie, ale może czuć się swobodnie zignorować), nie sądzę sposób zmieniła się od NT. Używasz SystemParametersInfo z SPI_SETSCREENSAVEACTIVE, aby zmienić zachowanie. Są one w pamięci user32.dll.

Ale mam mgliste wspomnienie widząc problemy zgłoszone z użyciem tej metody pod Win7 i myślę, że rozwiązaniem była zmiana rejestru, ustawienie ScreenSaveActive pod HKEY_CURRENT_USER\Control Panel\Desktop do 0 (iz powrotem do 1 kiedy skończysz).

+1

powiedzieć, że jest to długi * autoodtwarzanie *, który może być odtwarzany podczas gry, w której wprowadzanie użytkownika nie jest wymagane. nie chcesz, żeby wygaszacz ekranu przeszkadzał Twojemu użytkownikowi – gldraphael

+3

Zły pomysł? a co z odtwarzaczami multimedialnymi? –

1

To nie jest zły pomysł, każdy przyzwoity odtwarzacz multimedialny to robi ... Poszukaj funkcji SystemParametersInfo(SPI_SETSCREENSAVEACTIVE ...) w api Win32, powinno to wystarczyć.

+2

Nie to robią odtwarzacze multimediów. Zobacz moją odpowiedź. –

Powiązane problemy