Wie bekomme ich raus ob der PC ausgeschaltet, oder neugestartet werden...



  • Hallo vielleicht kann mir jemand helfen,

    wie bekomme raus ob der Anwender auf Start->Computer ausschalten->Ausschalten, oder auf Neustarten geklickt hat?

    Ich möchte bei jedem Neustart oder Herunterfahren meine Quelltexte mit robocopy sichern.

    Das Problem ist wenn ich TObject::Dispatch(&Msg) und die while Schleife auskommentiere erfolgt kein Neustart. Doch robocopy funktioniert einwandfrei.

    Mit while Schleife und Dispatch kriege ich eine Fehlermeldung "Die Anwendung konnte nicht initialisiert werden"

    Wenn ich jetzt raus kriegen könnte wo der Anwender rauf geklickt hat, könnte ich im Programm darauf entsprechend reagieren. Doch leider konnte ich in den letzten 24 Stunden ohne Pause nichts in der Hilfe und Online Dokumentation finden.

    Hat jemand eine Idee?

    Hier ein kleiner Auszug vom Quelltext

    void __fastcall TF1::OnShutdown(TMessage &Msg)
    {
      switch(Msg.Msg)
      {
    	case WM_QUERYENDSESSION:
    	{
          STARTUPINFO StartInfo = {0};
    	  StartInfo.cb = sizeof(StartInfo);
    	  StartInfo.wShowWindow = SW_SHOWNORMAL;//SW_HIDE;
    	  StartInfo.dwFlags = STARTF_USESHOWWINDOW;
    	  PROCESS_INFORMATION ProcInfo = {0};
    	  String Str = "robocopy.exe C:\\temp C:\\cc /MIR";
    
    	  if(CreateProcess(NULL, Str.c_str(), NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS, NULL, NULL, &StartInfo, &ProcInfo) == true)
    	  {
    		CloseHandle(ProcInfo.hThread);
    		WaitForInputIdle(ProcInfo.hProcess, INFINITE);
    
    		while(WaitForSingleObject(ProcInfo.hProcess, 100) == WAIT_TIMEOUT)
    		{
    		  //tue nichts
    		}
    
    		CloseHandle(ProcInfo.hProcess);
    	  }
    	  TObject::Dispatch(&Msg);
    	  break;
    	}
      }
    }
    


  • Hallo,

    wieso nimmst du dafür nicht einfach ein Shutdown Script (http://www.windows-help-central.com/windows-shutdown-script.html) dafür? Ist IMHO weniger gefrickel.

    Ansonsten handle ich WM_QUERYENDSESSION immer so:

    void __fastcall TFormular::WndProc(TMessage &Message)
    {
    if (Message.Msg == WM_QUERYENDSESSION)
        {
        //Code
        Message.Result = true;
        return;
        }
    
    TForm::WndProc(Message);
    }
    

Anmelden zum Antworten