Rechner automatisch herunterfahren



  • Hallo,
    ich würde gerne ein Programm schreiben, das mir den Rechner (Windows 7) nach einer bestimmten Zeit nachdem die letzte Tastatureingabe oder das letzte mal die Maus bewegt wurde, herunterfährt. Als Erweiterung dachte ich könnte das Programm nachschauen ob bestimmte Programme aktiv sind, z.B. mein Backup Proramm oder mein Brenner Programm. Hintergrund des Vorhaben ist, ich vergesse Abends oftmals dass der PC noch an ist und schaue fern oder gehe ins Bed, da ist es natürlich Stromverschwendung die Kiste die ganze Zeit laufen zu lassen. So hier mal die Fragen:
    1. wie muss ein Programm aufgebaut sein oder wie realisiere ich es, dass es
    beim Computerstart unsichtbar gestartet wird und im Hintergrund läuft? Warscheinlich kommt jetzt die Antwort: als Dienst starten. Aber wie geht das bitte?
    2. wie kann ich das Programm dann zur Computerlaufzeit sichtbar machen um Konfigurationseinstellungen wie z.B. die Abschaltzeit zu verändern. Da bräuchte ich doch irgendein Clientprogramm das meinem unsichtbaren Programm den Befehl gibt sichtbar zu werden?
    3. benötigt das Programm zum herunterfahren des PCs Adminrechte?

    So das sollte erst mal reichen, wahrschinlich tun sich später noch weitere Fragen auf.


  • Mod

    Das kann doch die Stromsparschaltung selber.

    Und vernünftige Backup-Programm verhindern ja die Stromsparschaltung.



  • Schön aber wenn ich mit trotzdem solch ein Programm schreiben möchte.


  • Mod

    Dann musst Du SetSuspendState verwenden oder ExitWindowsEx.

    Allerdings wirst Du nicht überwachen können, wann die letzte Maus und Tastatureingabe war, denn diese kanst Du nur für Deine Session ermittlen. Es kann ja mehreee an Deinem PC geben.

    Außerdem merkst Du nicht, dss sich evtl. jemand anderes dagegen (regulär) wehrt.
    Viele Informationen stecken tiefin Windows drin und da kommt man eigentlich nicht ran.

    Ich wurde sagen: "Vergiss es"-

    http://msdn.microsoft.com/en-us/library/aa373201(VS.85).aspx



  • Martin Richter schrieb:

    Allerdings wirst Du nicht überwachen können, wann die letzte Maus und Tastatureingabe war, denn diese kanst Du nur für Deine Session ermittlen. Es kann ja mehreee an Deinem PC geben.

    Da das Tool nur auf meinem Rechner laufen soll, kann ich getrost sagen: da läuft immer nur eine Session.

    Martin Richter schrieb:

    Außerdem merkst Du nicht, dss sich evtl. jemand anderes dagegen (regulär) wehrt.

    Wie ist diese Aussage zu verstehen? Bezieht sich das auf eine weitere Session, dann könnte ich das getrost ignorieren, oder meinst du etwas anders damit.

    Also ich hab jetzt schon mal angefangen das Tool zu programmieren. Das Programm startet sich versteckt und erzeugt einen Mutex. Bei erneutem Start wird auf Vorhandensein des Mutex geprüft, wenn dies der Fall ist, schickt das zuletzt gestartete Programm einen Befehl um das erste Programm sichtbar zu machen, soweit so gut. Jetzt müsste ich die Maus und Tastaturüberwachung realisieren. Leider habe ich da keinerlei Ahnung für einen Ansatz. Kannst du mir helfen?



  • > Jetzt müsste ich die Maus und Tastaturüberwachung realisieren.
    Such mal hier im Forum oder im WinAPI-FAQ Forum nach SetWindowsHookEx.



  • GetLastInputInfo



  • Du könntest auch einen Screensaver schreiben, der ExitWindows aufruft, ggf. nach einer weiteren Verzögerung.



  • Also ich hab mir jetzt eine DLL erstellt um einen systemweiten Tastaturhook zu erstellen. Testweise logge ich die Tastatureingabe in einer Datei mit. Dieses mitloggen funktioniert von jeder Anwendung heraus. Das ist aber nicht Zweck des Hooks, er soll lediglich eine Nachricht an mein Hauptprogramm schicken um diesem Mitteilen, dass eine Eingabe erfolgte. Meine Hookproceduren sehen wie folgt aus.

    Also das hier geht:

    LRESULT __declspec(dllexport)__stdcall  CALLBACK Hook_KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
    
    	if(((DWORD)lParam & 0x40000000) && (nCode == HC_ACTION)){		
    		if((wParam >= VK_LBUTTON) && (wParam < 0x100)){
    			char	text[16];
    			sprintf(text, "0x%02X\r\n", wParam);
    			Hook_SaveBinaryFile("D:\\test.txt", text, "ab+", strlen(text));		//Funktion schreibt Code des Zeichens in eine Datei
    		}
      	}
    	return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    

    das hier nur bedingt

    #define WM_KEYSTROKEDETECTED		(WM_USER +1)
    
    LRESULT __declspec(dllexport)__stdcall  CALLBACK Hook_KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
    
    	if(((DWORD)lParam & 0x40000000) && (nCode == HC_ACTION)){		
    		if((wParam >= VK_LBUTTON) && (wParam < 0x100)){
    			PostMessage(hDlgMain, WM_KEYSTROKEDETECTED, 0, 0);		//geht nicht
    //oder
    			SendMessage(hDlgMain, WM_KEYSTROKEDETECTED,0, 0);	//geht auch nicht
    		}
      	}
    	return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    

    Also mein Hauptprogramm bekommt die Messages nur wenn es auch das aktive Fenster ist. hDlgMain hab ich beim Start des Hooks so Initialisiert

    #pragma	data_seg(".SHARDAT")
    static HHOOK	hHook = NULL;
    #pragma	data_seg()
    HWND		hDlgMain;
    HINSTANCE	hInstance;
    #pragma comment(linker, "/section:.SHARDAT,RWS")
    
    void __declspec(dllexport)Hook_InitHook(HINSTANCE hInstanceDLL, HWND hWnd){
    
    	hInstance = hInstanceDLL;
    	hDlgMain = hWnd;
    }
    

    Meiner Meinung nach stimmt wohl der Handel zu meinem Hauptprogramm hDlgMain nicht immer, kann mir jemand weiterhelfen und sagen wie es richtig gemacht wird.


Anmelden zum Antworten