Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Power off/Stand by/ Hibernate


Автор: devmstr 4.5.2005, 23:46
Как установить время, через которое комп. уснет, выключится и т.д.
Желательно используя Power Schemes, так как висеть в памяти дополнительной программой не хотелось бы.
Помогите пожалуста. Проект горит..

Автор: AISIN 5.5.2005, 00:08
magician Обычный таймер устанавливаешь.
Код
 
В ClasWizard в меню View
WM_INITDIALOG
BOOL ....::OnInitDialog(){
int i;
i=SetTimer(1,500,NULL);
if(i==0){
//ERRRor
}
return TRUE;
}
void ....::OnTimer(UINT nIDEvent(){
PostMessage(HWND_BROADCAST,WM_SYSCOMMAND,SC_MONITORPOWER,2L);
//не забудь убить таймер ато будет запускаться эта функция каждые 500 //милисек кажется KillerTimer() как то так!!!
}

Вроде ничего не перепутал

Автор: devmstr 5.5.2005, 08:01
AISIN
Спасибо, конечно но тут такая проблема. Вообщем все таки хотелось бы используя средства Windows, в смысле чтобы самому в памяти не висеть.
Вообщем мне нужно выключить(stand by, hibernate) комп, после некоторого промежутка времени, во время которого пользователь за компом не работал.
В принципе все хорошо, это использование hook, вообщем проблем нет, Но!
Данная программа должна работать и тогда, когда пользователь не залогинен - сервис.
Вообщем можно конечно и так, но что-то мне подсказывает, что есть более простой способ, с использованием самой Windows.

Автор: AISIN 5.5.2005, 14:04
magician
Если надо будет включить монитор то исправишь на 1L
Cмотри какoй интересный листинг нашел.
Код


// The caption of our message box
TCHAR g_szCaption[] = TEXT("Timed Message Box");


// How many seconds we'll display the message box
int g_nSecLeft = 0;


// This is STATIC window control ID for a message box
#define ID_MSGBOX_STATIC_TEXT    0x0000ffff


//////////////////////////////////////////////////////////////////////////////


VOID WINAPI MsgBoxTimeout(PVOID pvContext, BOOLEAN fTimeout) {

   // NOTE: Due to a thread race condition, it is possible (but very unlikely)
   // that the message box will not be created when we get here.
   HWND hwnd = FindWindow(NULL, g_szCaption);

   if (hwnd != NULL) {
      // The window does exist; update the time remaining.
      TCHAR sz[100];
      wsprintf(sz, TEXT("You have %d seconds to respond"), g_nSecLeft--);
      SetDlgItemText(hwnd, ID_MSGBOX_STATIC_TEXT, sz);

      if (g_nSecLeft == 0) {
         // The time is up; force the message box to exit.
         EndDialog(hwnd, IDOK);
      }
   } else {

      // The window does not exist yet; do nothing this time.
      // We'll try again in another second.
   }
}


//////////////////////////////////////////////////////////////////////////////


int WINAPI _tWinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int) {

   chWindows9xNotAllowed();

   // How many seconds we'll give the user to respond
   g_nSecLeft = 10;

   // Create a multishot 1 second timer that begins firing after 1 second.
   HANDLE hTimerQTimer;
   CreateTimerQueueTimer(&hTimerQTimer, NULL, MsgBoxTimeout, NULL, 
      1000, 1000, 0);

   // Display the message box
   MessageBox(NULL, TEXT("You have 10 seconds to respond"), 
      g_szCaption, MB_OK);

   // Cancel the timer & delete the timer queue
   DeleteTimerQueueTimer(NULL, hTimerQTimer, NULL);

   // Let us know if the user responded or if we timed-out.
   MessageBox(NULL, 
      (g_nSecLeft == 0) ? TEXT("Timeout") : TEXT("User responded"), 
         TEXT("Result"), MB_OK);

   return(0);
}


//////////////////////////////// End of File /////////////////////////////////



Автор: devmstr 7.5.2005, 07:35
AISIN
Спасибо, интерстный код, хотя к сожалению он моей проблемы, тем путем, которым хотелось бы не решает...

Автор: DeHunter 8.5.2005, 18:28
Можно попробывать запустить shutdown.exe с ключом.
Или с помошью CreateRemoteThread сделать инжект кода в експлорер. Код будет ждать определённое время потом делать ExitWindowsEx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)