/**************/ /* winexit.c */ /****************************************************************************** PROGRAM: winexit.c Windows: Win 3.1 & WIN32 PURPOSE: Ajaa halutut ohjelmat ja sammuttaa Windowsin sekä näyttää otsikkopalkissa valittua tekstiä Editor: Vesa Lappalainen 29.6.1995 Inifile: [WinExit] ExitWhenClose=1 ; Kun WinExit -suljetaan, suljetaan myös Windows QuitAfterDone=1 ; WinExit lopetetaan kun muut optiot on suoritettu. Tämä on lähinnä sitä varten, että WinExitiä voidaan käyttäää alkeellisena "komentojonona", jos ajetaan [RUN]-kohdan ohjelmia (tällöin tarvitaan komentorivin optio -r tai DoRun0= HUOM! Jos molemmat em. ovat päällä ja WinExit on StartUp-ryhmässä, sammuu Windows aina heti käynnistyksensä jälkeen! WindowText=vesal ; Otsikkopalkin teksti Format=Tunnus: %s ; Miten teksti tulostetaan, ks. C-format Esimerkissä tulostuisi Tunnus: vesal Prompt=Lopetetaanko?; Windowsin sulkemisessa käytettävä kysymys ; Jollei tätä ole, suljetaan ilman kysymystä DoRun0=RUN ; Minkä kohdan "komennot" ajetaan DoRun1=... ; KOhtia voi olla useita [RUN] run0=notebad ; 1. ajettava ohjelma run1=wincd ; 2. ajettava ohjelma [POS] AllWaysOnTop=1 ; Onko aina päällimmäisenä ; Lisäksi tulee automaattisesti edellisen ; kerran paikka Command: winexit [options] Options: Jos vastaava optio on myös -ini-tiedostossa, kumotaan tämä -i=inifilename ; luettavan initiedoston nimi, jollei polkua etsitään ensin oletushakemistosta, sitten windowshakemistosta ja lopuksi ohjelman käynnistyshakemistosta oletus: winexit.ini -r=runsection ; Minkä nimisen otsikon alta etsitään ajettavia ohjelmia. Ohjelmat ajetaan järjestyksessä run0, run1 kunnes ei ole runN määritystä. -r optioita voi olla useita, jolloin ajetaan kaikkien ko. otsikoiden alla olevat ohjelmat järjestyksessä (Huom! moniajo!) -w=title ; kumoaa mahd. ini-tiedoston WindowText asetuksen -p=message ; tulostetaan viesti Windowsin sulkemisen yhteydessä -e ; lopetetaan Windows samalla kun winexit [+|-] lopetetaan. Jos tämä optio on päällä, ei winExit -ohjelmaa voi sulkea sulkematta Windowsia. Jos optiot ei ole päällä INI-tiedostossa, niin nyt se laitetaan -e+ == -e == lopetetaan Windows -e- == ei lopeteta Windosia -q ; lopetetaan winexit kun muut optiot suoritettu -q+ == -q == lopetetaan -q- == ei lopeteta Example: winexit -i=win.ini -r=run -e -p="Oletko tosissaan" PROJECT: winexit.c winexit.rc winexit.def ALI\tabhand.c ALI\savepos.c ALI\mjonot.c ALI\mdialog.c ALI\filename.c ALI\ininame.c ALI\allwtop.c Historia: Versio 26.6.1995 + optiot + lisää ini-tiedoston parametreja Versio 19.8.1995 + osa aliohjelmista siirretty yleiskäyttöiseksi + otsikkopalkin tuplaklikkaus sulkee Windowsin Korjattavaa: - ??? ****************************************************************************/ #define VERSION "0.21 19.8.1995/vl" #include #include #include #include #include #include #include #include "mjonot.h" #include "tabhand.h" #include "savepos.h" #include "filename.h" #include "winexit.rh" #include "ininame.h" #include "allwtop.h" #define WINEXITPOS "POS" typedef struct { int ExitWhenClose; int QuitAfterDone; char *prompt; char ini[200]; } tGlobalOptions; static tGlobalOptions G = {0,0,NULL,""}; /*****************************************************************************/ /* "Pääohjelma" ja ikkunaluokan asetus siten, että tuplaklikkaus on mahd. */ static void setwc(tCreWndSt *c) { c->wc.style = CS_DBLCLKS;} TblClassDlgMAINWC("WinExitWClass","ikoni","Menu","WinExit",MsgTbl,setwc); /*****************************************************************************/ /*****************************************************************************/ /* Versiotieto sellaisena kuin MDialogAbout sen haluaa */ static tVersionInfo Version = {IDC_VERSION,"Version "mPLATFORM":\r\n"VERSION}; /*****************************************************************************/ /*****************************************************************************/ /* Apualiohjelmia: */ /*****************************************************************************/ /*****************************************************************************/ static int InitMenu(HWND hWnd,const char *ininame) /* Alustaa systeemimenuun Allways On Top -kohdan, About -dialogin ja windowsin ** Sammuttamisen -----------------------------------------------------------------------------*/ { HMENU hMenu = AppendSystemMenuAllwaysOnTop(hWnd,ininame,1); AppendMenu(hMenu, MF_STRING, CM_HELPABOUT , "&About WinExit..."); if ( G.prompt ) AppendMenu(hMenu, MF_STRING, CM_WINEXIT , "E&xit Windows..."); else AppendMenu(hMenu, MF_STRING, CM_WINEXIT , "E&xit Windows") ; return 0; } /*****************************************************************************/ static int RunProgs(const char *ininame, const char *sec) /* Ajaa INI-tiedostosta [sec]-kohdasta löytyvät ohjelmat runN=komento, ** missä N=0,1,2, kunnes runN ei enää ole -----------------------------------------------------------------------------*/ { char s[20],name[200]; int i,n; for (i=0; i<200;i++) { sprintf(s,"run%d",i); n = GetPrivateProfileString(sec,s,"",name,sizeof(name),ininame); if ( n == 0 ) break; WinExec(name,SW_SHOWMINIMIZED/*SW_SHOWNORMAL*/); } return 0; } /*****************************************************************************/ static int CheckDoRun(const char *ininame) /* Tutkii ja ajaa INI-tiedostosta [WinExit]-kohdasta löytyvät DoRunN -kohdat ** missä N=0,1,2, kunnes runN ei enää ole -----------------------------------------------------------------------------*/ { char s[20],name[50]; int i,n; for (i=0; i<200;i++) { sprintf(s,"DoRun%d",i); n = GetPrivateProfileString("WinExit",s,"",name,sizeof(name),ininame); if ( n == 0 ) break; RunProgs(ininame,name); } return 0; } #define FOR_ARGS(t) for (i=1; i<_argc; i++) if ( strncmp(_argv[i],t,strlen(t)) == 0 ) #define ARGV (_argv[i]+3) #define ARGB ( _argv[i][2] != '-' ) /* - => 0, + ja tyhjä => 1 */ /*****************************************************************************/ static int DoInit(HWND hWnd) /* Tekee ohjelman alustamisessa tarvittavat toimenpiteet, eli tulkitsee ** INI-tiedoston ja optiot, sekä alustaa systeemimenun. -----------------------------------------------------------------------------*/ { int i; char s[100],f[100],m[200]; static char prompt[100]; FindIniFileName(N_S(G.ini),NULL); RestorePos(hWnd,G.ini,WINEXITPOS,1); GetPrivateProfileString("WinExit","Prompt","",N_S(prompt),G.ini); GetPrivateProfileString("WinExit","WindowText","",N_S(s),G.ini); GetPrivateProfileString("WinExit","Format","- %s -",N_S(f),G.ini); G.ExitWhenClose = GetPrivateProfileInt("WinExit","ExitWhenClose",0,G.ini); G.QuitAfterDone = GetPrivateProfileInt("WinExit","QuitAfterDone",0,G.ini); GetPrivateProfileString("WinExit","WindowText","",N_S(s),G.ini); CheckDoRun(G.ini); FOR_ARGS("-w=") kopioi_jono(N_S(s),ARGV); sprintf(m,f,s); if ( s[0] ) SetWindowText(hWnd,m); FOR_ARGS("-e") G.ExitWhenClose = ARGB; FOR_ARGS("-q") G.QuitAfterDone = ARGB; FOR_ARGS("-p=") kopioi_jono(N_S(prompt),ARGV); G.prompt = prompt ? prompt : NULL; FOR_ARGS("-r=") RunProgs(G.ini,ARGV); InitMenu(hWnd,G.ini); return G.QuitAfterDone; } #undef ARGB #undef ARGV #undef FOR_ARGS /*****************************************************************************/ static int DoExit(HWND hWnd) /* Tekee WIndowsin lopettamisessa tarvittavat toimenpiteet. Jos prompt -jono ** on olemassa, niin kysytään käyttäjältä varmistus Windowsin sulkemiseen -----------------------------------------------------------------------------*/ { if ( G.prompt && MessageBox(hWnd,G.prompt,"WinExit",MB_ICONQUESTION | MB_YESNOCANCEL) != IDYES ) return 1; if ( ExitWindows(0 ,0) == 0 ) return 1; return 0; } /*****************************************************************************/ static int DoClose(HWND hWnd) /* Itse ohjelman sulkeminen. Tallettaa arvot INI-tiedostoon ja jos ohjelman ** sulkemisen yhteydessä pitää sulkea myös Windows (-e optio), niin tehdään se. -----------------------------------------------------------------------------*/ { SaveAllwaysOnTop(hWnd,G.ini); SavePos(hWnd,G.ini,WINEXITPOS,SAVEPOS_SIZE); if ( G.ExitWhenClose && DoExit(hWnd) ) return 1; SendMessage(hWnd,WM_DESTROY,0,0); return 0; } /*****************************************************************************/ /* E V E N T S : */ static EVENT WM_command_CM_WINEXIT(tMSGParam *msg) { return DoExit(msg->hWnd); } static EVENT WM_initdialog(tMSGParam *msg) { if ( DoInit(msg->hWnd) ) return DoClose(msg->hWnd); return 0; } static EVENT WM_close(tMSGParam *msg) { return DoClose(msg->hWnd); } /*****************************************************************************/ /* Viestitaulukko,johon on käsin lisätty valmiita käsittelijöitä */ /* ja samaistettu joitakin viestejä omiin käsittelijöihin. */ /*****************************************************************************/ static tMSGEntry MsgTbl[] = { EV_HANDLE_WM_DESTROY, EV_HANDLE_CM_ALLWAYSONTOP, EV_HANDLE_MABOUT(WM_SYSCOMMAND,CM_HELPABOUT,&Version), { WM_ENDSESSION , DoC , DoC , WM_close }, { WM_NCLBUTTONDBLCLK, DoC , DoC , WM_command_CM_WINEXIT }, { WM_SYSCOMMAND , CM_WINEXIT , DoC , WM_command_CM_WINEXIT }, { WM_COMMAND , CM_WINEXIT , DoC, WM_command_CM_WINEXIT }, /*a*/ { WM_INITDIALOG , DoC , DoC , WM_initdialog }, /*a*/ { WM_CLOSE , DoC , DoC , WM_close }, /*a*/ { 0 } };