diff --git a/HibernationDelayer/HibernationDelayer.h b/HibernationDelayer/HibernationDelayer.h index 575af95..630a55f 100644 --- a/HibernationDelayer/HibernationDelayer.h +++ b/HibernationDelayer/HibernationDelayer.h @@ -5,6 +5,9 @@ #include #include #include +#include + +#pragma comment(lib, "PowrProf.lib") // Dołączanie biblioteki PowrProf.lib namespace HibernationDelayer { using namespace System; @@ -81,7 +84,10 @@ namespace HibernationDelayer { private: int pozostaly_czas_start = 0; //Zapamiętanie czasu na jaki ustawiono zahibernowanie private: int pozostaly_czas = 0; //przechowywanie aktualnego czasu do hibernacji private: bool MonitorWylaczony = false; //stan czy monitor był wyłaczany - private: System::String^ jezyk = gcnew String(""); + private: System::String^ jezyk = gcnew String(""); //przechowywanie kodu języka + private: unsigned int CzasDomyslnyAC = NULL; + private: unsigned int CzasDomyslnyDC = NULL; + protected: @@ -403,6 +409,7 @@ namespace HibernationDelayer { this->MinimumSize = System::Drawing::Size(300, 300); this->Name = L"HibernationDelayer"; this->Text = L"HibernationDelayer"; + this->FormClosing += gcnew System::Windows::Forms::FormClosingEventHandler(this, &HibernationDelayer::zamykanie); this->Load += gcnew System::EventHandler(this, &HibernationDelayer::hibernacja_Load); this->contextMenuStrip1->ResumeLayout(false); this->groupBox1->ResumeLayout(false); @@ -496,6 +503,17 @@ namespace HibernationDelayer { pozostaly_czas_start = sekundy; //wyswietloenie pozostałego czasu this->lblPozostalyVal->Text = Sekundy2string(pozostaly_czas); + //sprawdzenie czy zaznaczone wygaszenie monitora. Jeżeli tak to ustawienie odpowiednich czasów + if (this->checkMonitor->Checked) { + GUID* activeScheme; //GUID aktualnie wybranego planu + const GUID GUID_VIDEO_SUBGROUP = { 0x7516b95f, 0xf776, 0x4464, {0x8c, 0x53, 0x06, 0x16, 0x7f, 0x40, 0xcc, 0x99} }; //wartość stała niezalezna od wybranego planu + const GUID VIDEOIDLE = { 0x3c0bc021, 0xc8a8, 0x4e07, {0xa9, 0x73, 0x6b, 0x14, 0xcb, 0xcb, 0x2b, 0x7e} }; + const unsigned int czas_wygas = 120; //ustawiony na sztywno czas wygaszenia ekranu wynoszący 2 minuty + PowerGetActiveScheme(NULL, &activeScheme); //odczyt aktualnie wybranego planu + PowerWriteACValueIndex(NULL, activeScheme, &GUID_VIDEO_SUBGROUP, &VIDEOIDLE, czas_wygas); + PowerWriteDCValueIndex(NULL, activeScheme, &GUID_VIDEO_SUBGROUP, &VIDEOIDLE, czas_wygas); + PowerSetActiveScheme(NULL, activeScheme); + } //uruchomienie timera, odliczającego zadany czas this->timer1->Enabled = true; timer1->Start(); @@ -532,17 +550,7 @@ namespace HibernationDelayer { //wyświetlanie pozostałego czasu i paska postępu this->lblPozostalyVal->Text = Sekundy2string(pozostaly_czas); this->progressBar1->Value = System::Convert::ToInt32(100 - trunc(100 * pozostaly_czas / pozostaly_czas_start)); - //wykonanie akcji po 2 minutach od uruchomienia timera - if (this->checkMonitor->Checked && !MonitorWylaczony && pozostaly_czas_start - pozostaly_czas > 120) { - //blokada kolejnego wyłączania monitora - MonitorWylaczony = true; - //wyzwolenie wyłączenia monitora - //TODO poprawić tę funkcję aby była bardziej uniwersalna - this->lblMonitor->ForeColor = Color::FromName("Red"); - SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)2); - //SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED | ES_AWAYMODE_REQUIRED); - - } + //wykonanie akcji gdy czas dobiegł do końca if (pozostaly_czas <= 0) @@ -550,23 +558,27 @@ namespace HibernationDelayer { } /*funkcja wykonująca zatrzymanie timera, wykonująca hibernację i samozamknięcie aplikacji*/ private: System::Void akcja() { - timer1->Stop(); - system("shutdown /h"); - Application::Exit(); + timer1->Stop();//zatrzymanie timera + domyslne_czasy_zapis();//przywrócenie czasów wygaszenia monitora (domyślnych) + system("shutdown /h");//wykonanie hibernacji + Application::Exit(); //zamknięcie aplikacji } /*Funkcja wykonujaca przerwanie odliczania po naciśnięciu odpowiedniego przycisku*/ private: System::Void btnAnuluj_Click(System::Object^ sender, System::EventArgs^ e) { - //zatrzymanie timera - timer1->Stop(); + + timer1->Stop();//zatrzymanie timera this->timer1->Enabled = false; //wyserowanie czasu pozostałego do hibernacji pozostaly_czas = 0; this->lblPozostalyVal->Text = Sekundy2string(pozostaly_czas); this->progressBar1->Value = 0; this->lblMonitor->ResetForeColor(); + //przywrócenie domyślnego czasu wygaszenia monitora + domyslne_czasy_zapis(); } /*Wykonanie hibernacji natychmiastowej po aktywacji stosownego przycisku*/ private: System::Void btnHiberTeraz_Click(System::Object^ sender, System::EventArgs^ e) { + domyslne_czasy_zapis();//ustawienie domyślnych czasów wygaszenia monitora system("shutdown /h"); Application::Exit(); } @@ -641,7 +653,17 @@ namespace HibernationDelayer { } //ustawienie etykiety czasu do hibernacji this->lblPozostalyVal->Text = Sekundy2string(pozostaly_czas); - + //odczyt aktualnego czasu do wygaszenia monitora + GUID* activeScheme; //GUID aktualnie wybranego planu + const GUID GUID_VIDEO_SUBGROUP = { 0x7516b95f, 0xf776, 0x4464, {0x8c, 0x53, 0x06, 0x16, 0x7f, 0x40, 0xcc, 0x99} }; //wartość stała niezalezna od wybranego planu + const GUID VIDEOIDLE = { 0x3c0bc021, 0xc8a8, 0x4e07, {0xa9, 0x73, 0x6b, 0x14, 0xcb, 0xcb, 0x2b, 0x7e} }; + DWORD wartoscAC = NULL; + DWORD wartoscDC = NULL; + PowerGetActiveScheme(NULL, &activeScheme); //odczyt aktualnie wybranego planu + PowerReadACValueIndex(NULL, activeScheme, &GUID_VIDEO_SUBGROUP, &VIDEOIDLE, &wartoscAC); //odczytanie wartości czasu wygaszania ekranu dla zasilania sieciowego + PowerReadDCValueIndex(NULL, activeScheme, &GUID_VIDEO_SUBGROUP, &VIDEOIDLE, &wartoscDC); //odczytanie wartości czasu wygaszania ekranu dla zasilania bateryjnego + CzasDomyslnyAC = wartoscAC; + CzasDomyslnyDC = wartoscDC; } @@ -658,5 +680,19 @@ namespace HibernationDelayer { // } +private: System::Void zamykanie(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) { + domyslne_czasy_zapis(); + Sleep(1000); +} + System::Void domyslne_czasy_zapis() { + //przywrócenie domyślnego czasu wygaszenia ekranu + GUID* activeScheme; //GUID aktualnie wybranego planu + const GUID GUID_VIDEO_SUBGROUP = { 0x7516b95f, 0xf776, 0x4464, {0x8c, 0x53, 0x06, 0x16, 0x7f, 0x40, 0xcc, 0x99} }; //wartość stała niezalezna od wybranego planu + const GUID VIDEOIDLE = { 0x3c0bc021, 0xc8a8, 0x4e07, {0xa9, 0x73, 0x6b, 0x14, 0xcb, 0xcb, 0x2b, 0x7e} }; + PowerGetActiveScheme(NULL, &activeScheme); //odczyt aktualnie wybranego planu + PowerWriteACValueIndex(NULL, activeScheme, &GUID_VIDEO_SUBGROUP, &VIDEOIDLE, CzasDomyslnyAC); + PowerWriteDCValueIndex(NULL, activeScheme, &GUID_VIDEO_SUBGROUP, &VIDEOIDLE, CzasDomyslnyDC); + PowerSetActiveScheme(NULL, activeScheme); + } }; } diff --git a/HibernationDelayer/HibernationDelayer.resx b/HibernationDelayer/HibernationDelayer.resx index 9abe963..07b05f0 100644 --- a/HibernationDelayer/HibernationDelayer.resx +++ b/HibernationDelayer/HibernationDelayer.resx @@ -121,7 +121,7 @@ iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAA - 6gAAAOoB+Ss1JgAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJMSURBVFhHYxgF + 6QAAAOkBVJIUSwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJMSURBVFhHYxgF gxIwc7AmsfFzXmfl5ZgJ5IpAROkH+Fi42L44LM/4r5Zs9wPI/sjEypoDFGeGSNMeqHHLCL4PuNT8H4Rd txb+FzVX+gIMjTtAOWuIEtoCFAfAsMXk6P8conxf2Xg51wLViEOU0gZgdQAI+51t+K9T6vmThYf9ExMb SzVQLRtEC3UBTgfAsPvu0v9SbtqfWLjZHwPVu0K0UQ8QdAAMW89O/M8pKQByyF6gPlmIdsoB0Q4AYb9z