Obsah článku
Před časem jsem se rozhodl sepsat si utilitku, která by rozšířila možnosti interních aplikací systému Windows. Současná verze přidává aplikaci shutdown možnost načasovat odhlášení, hibernaci, restart i vypnutí. Čas zbývající do konce je indikován pomocí ukazatele a proces lze kdykoliv přerušit. Pro zájemce přikládám zdrojový kód této „C++ Win32 konzolové aplikace“ (měla by být po zkompilování funkční na všech verzích MS Windows).
/*
Autor: Petr Knap (kontakt@petrknap.cz)
Web: http://petrknap.cz
OS: MS Windows
Verze:
06/11/2009: 0.1.0 - shutdown
08/11/2009: 0.2.0 - timer
12/11/2009: 0.3.0 - debug mode
12/11/2009: 0.3.1 - opraveny textove hlasky
15/11/2009: 0.3.2 - vylepseny debug mode
*/
#include "stdafx.h"
#include <conio.h>
#include <windows.h> // fce Sleep(seconds)
#include <time.h>
#define CLS {system("cls");}
#define TITLE {printf("\t\tCMD tools\n\n");}
#define DEBUG 1
char mode;
char a[256] = "";
void wait(int t, bool print);
void timer(void);
int shutdown(void);
// hlavni menu
int main(void)
{
CLS
TITLE
shutdown();
#if DEBUG
getch();
#endif
return 0;
}
// FCE pro vypnuti PC
int shutdown(void)
/*
i - GUI
l - odhlaseni
s - vypnuti
r - restart
h - hibernace
f - vynucene ukonceni aplikaci
*/
{
bool f;
start:
CLS
TITLE
// menu
printf("Zvolte akci:\n");
printf("\tl - odhlaseni\n");
printf("\tr - restartovani\n");
printf("\th - hibernace (tvrdy spanek)\n");
printf("\ts - vypnuti\n");
mode = getch();
// shutdown
printf("\n");
switch(mode)
{
case 'l':
sprintf(a, "odhlaseni");
f = true;
break;
case 'r':
sprintf(a, "restartovani");
f = true;
break;
case 'h':
sprintf(a, "hibernace");
f= false;
break;
case 's':
sprintf(a, "vypnuti");
f = true;
break;
default:
goto start;
break;
}
printf("\n");
timer();
sprintf(a, "start shutdown /%c", mode);
if(f) sprintf(a, "%s /f", a);
#if DEBUG
printf("%s\n",a);
#else
system(a);
#endif
// konec
return 0;
}
// FCE pro cekani (cas, tisk)
void wait(int t, bool print)
{
int d = 60; // pocet dilku ukazatele
if(print)
{
printf("["); // tisk sablony ukazatele
for(int i = 0; i < d; i++)
printf(" ");
printf("]\b");
for(int i = 0; i < d; i++)
printf("\b"); // navrat na zacatek ukazatele
}
else
d = 1;
for(int i = 0; i < d*3; i++)
{
Sleep((unsigned int)((float)t/d/3*1000)); // uspani na dobu jednoho dilku
if(print)
{
switch(i%3) // vyplnovani ukazatele
{
case 0:
printf("-\b");
break;
case 1:
printf("+\b");
break;
case 2:
printf("#");
break;
}
}
}
if(print)
{
printf("]\n"); // uzavreni ukazatele
}
}
void timer(void)
{
int t, th, tm, ts;
#if DEBUG
time_t start,end;
double dif;
#endif
printf("Zadejte cas do %s [h:m:s]: ", a);
scanf("%d:%d:%d",&th,&tm,&ts);
t = ts + tm*60 + th*60*60;
printf("\nPro zruseni %s stisknete CTRL+C.\n", a);
#if DEBUG
time(&start);
#endif
wait(t, true);
#if DEBUG
time(&end);
dif = difftime (end,start);
printf("Proces trval %.2lf sekund.\n", dif);
#endif
}
Pokud byste měli nápad jak něco zlepšit, napište. V opačném případě se sem sem tam koukněte. Za určitý čas se tu objeví další verze a pokud bude dobře fungovat, přidám sem i zkompilovaný program. Pokud nechcete čekat, aplikaci si můžete zkompilovat sami například v MS Visual Studiu.