* Runs Forever (put in startup) *** Required Tables ARON and NOTRON * #define GW_HWNDFIRST 0 #define GW_HWNDLAST 1 #define GW_HWNDNEXT 2 #define GW_HWNDPREV 3 #define GW_OWNER 4 #define GW_CHILD 5 DECLARE Long GetWindow IN WIN32API Long hWnd, Long uCmd DECLARE Long GetWindowText IN WIN32API Long hWnd, String @lpString, Long nMaxCount DECLARE INTEGER GetDesktopWindow IN Win32API DECLARE LONG GetWindowLong IN WIN32API Long hWnd, Long nIndex #define GWL_EXSTYLE -20 #define GWL_STYLE -16 #define WS_EX_APPWINDOW 0x00040000 #define WS_VISIBLE 0x10000000 #define WS_POPUP 0x80000000 Set Status Off Set Status Bar Off SET CONSOLE OFF SET DISPLAY TO VGA50 SET MESSAGE TO 23 CENTER SET ECHO OFF SET NOTIFY OFF Set SysMenu To Set Escape On _Screen.Height= 333 nLoadedHeight= 333 _Screen.BackColor= RGB(255,200,155) Use ARON USE notron IN 0 SELECT ARON Clear tTestJanitor= DATETIME() tstart= DATETIME() lcDay= "00" nJulian= Date()-Date(Year(Date()),1,1)+1 cFHJulian= Padl(AllTrim(Str(nJulian)),3,"0") cLogFileName= "e:\CRON\LOGS\LOG_"+ cFHJulian+ ".TXT" DO POSSIBLERECOVER @ 2,1 Say " Maximize Screen to Close Tables and Halt ARON AMCTimer!" FONT 'Courier',6 @ 3,1 Say " Press 'b' to browse Time-Tables (ARON and NOTRON)." FONT 'Courier',6 Do While .T. nJulian= Date()-Date(Year(Date()),1,1)+1 cFHJulian= Padl(AllTrim(Str(nJulian)),3,"0") cLogFileName= "e:\CRON\LOGS\TIME"+ cFHJulian+ ".TXT" lRunSomething = .F. lRunExecutable= .F. cProgramSwitch= "" If nLoadedHeight+ 3 < _Screen.Height _Screen.BackColor= 5630 SELECT ARON Brow SELECT notron Brow USE Janitor Brow Wait Window "Restart ARON TIMER! " TimeOut 13 Exit Else && User Peak lnMinutes = (round((dateTime() - tStart)/60 , 0)) lcDay = PADL(INT(lnMinutes/1440),3) lcHours = PADL(INT((lnMinutes % 1440)/60),2,"0") _Screen.BackColor= RGB(DOW(DATE())*29,256-(DAY(DATE())/2)-(DOW(DATE())*9),(DOW(DATE())-1)*42) @ 2,1 Say " Maximize Screen to Close Tables and Halt ArON AMCTimer!" FONT 'Courier',6 @ 3,1 Say " Press 'b' to browse Time-Tables (ARON and NOTRON)." FONT 'Courier',6 @ 1,1 c2Say= " Continual Processing for "+ ; IIF(ALLTRIM(lcDay)= "1","1 day and ",ALLTRIM(lcDay)+" days and ")+ ; IIF(lchours = "01","1 hour.",lcHours+" hours.") @ 1,1 Say c2Say FONT 'Courier',6 @ 8,1 Say " Timer Log File at: "+ cLogFileName FONT 'Courier',6 IF INKEY(.3)= 98 && b SELECT ARON Brow SELECT notron Brow ENDIF EndIf Scan If Active && Active Test If SubStr(Upper(CDOW(DateTime())),1,3) $ Dow && Day-Of-Week Test or Today already-run Test If IIf(Year(DateTime()) > Year(LastRun), .T., Iif(Month(DateTime()) > Month(LastRun), .T., Iif(Day(DateTime()) > Day(LastRun), .T., Iif(Day(DateTime()) = Day(LastRun), IIF(CTOT(Time) > DATETIME(), .T., .F.), .F.)))) lTimeWarp= .F. IF IIF(Hour(DateTime()) > Hour(cToT(Time)), .T., IIF(!(Hour(cToT(Time)) > Hour(DateTime())) AND !(Minute(cToT(Time)) > Minute(DateTime())), .T., .F.)) lTimeWarp= .T. && The Hour has Passed ENDIF IF lTimeWarp If !(SubStr(Upper(CDOW(DateTime())),1,3) $ Skip) && Skip Test IF ALIAS()= "ARON" IF MakeCursor() && Run when System is not busy with AMCRON program Replace LastRun With DateTime() lRunSomething= .T. ELSE gLogMESS= AllTrim(TTOC((DateTime())))+ " BUSY: AMC not run "+AllTrim(cProgramSwitch) Do WriteLog EXIT // Leave Scan ENDIF *cut... Program switch identified and used as parameter ELSE // NOTCRON Replace LastRun With DateTime() lRunExecutable= .T. EXIT // Leave Scan ENDIF // TABLE SELECTION EndIf // Skip Requested EndIf // Time Passed (TimeWarp) EndIf // Ran Already EndIf // Day Of Week EndIf // Active EndScan If lRunSomething @ 5,0 @ 5,1 Say " "+AllTrim(TTOC((DateTime())))+ " Program AMC "+AllTrim(cProgramSwitch) FONT 'Courier',6 gLogMESS= AllTrim(TTOC((DateTime())))+ " Program AMC "+AllTrim(cProgramSwitch) Do WriteLog cRunScript= "C:\ARON\AMC.bat "+ cProgramSwitch loWRun=CreateObject("Wscript.Shell") loWRun.run("command /c &cRunScript",0,0) loWRun=NULL USE Use ARON IN 0 SELECT ARON EndIf IF lRunExecutable cProgramSwitch= ALLTRIM(notron.Program) @ 6,0 @ 6,1 Say " "+AllTrim(TTOC((DateTime())))+ " EXECUTABLE "+cProgramSwitch FONT 'Courier',6 gLogMESS= AllTrim(TTOC((DateTime())))+ " "+ cProgramSwitch Do WriteLog cRunScript= "Run /n "+ cProgramSwitch &cRunScript USE USE notron IN 0 SELECT notron ENDIF ChrSaw(17) IF ALIAS()= "ARON" && Toggle Tables SELECT notron ELSE SELECT ARON ENDIF EndDo Procedure WriteLog lFileFirstTime= .F. tToday = DATETIME( ) If FILE(cLogFileName) && Does file exist? gnLogFile = FOPEN(cLogFileName,12) && If so, open read-write Else gnLogFile = FCREATE(cLogFileName) && If not, create it lFileFirstTime= .T. Endif If gnLogFile < 0 && Check for error opening file Wait 'Cannot open or create LOG REPORT' WINDOW NOWAIT Else && If no error, write to file IF lFileFirstTime =FPUT(gnLogFile, _Screen.Caption+ CHR(13)) ENDIF =FSEEK(gnLogFile,0,2) && goto EOF Do Case Case Len(AllTrim(gLogMESS))< 61 =FWRITE(gnLogFile, PADR(gLogMESS,61," ")) =FPUT(gnLogFile, " Today "+TTOC(tToday)) Case Len(AllTrim(gLogMESS))< 68 =FWRITE(gnLogFile, PADR(gLogMESS,68," ")) =FPUT(gnLogFile, TTOC(tToday)) Otherwise =FPUT(gnLogFile, gLogMESS) EndCase Endif =FCLOSE(gnLogFile) && Close file Endproc PROCEDURE POSSIBLERECOVER && Power out recover nFile = ADIR(laFileListP, 'C:\Aron\AllZip\*.*') FOR nFiles= 1 TO nFile @ 7, 2 Say "ALLZIP put on HOLD!" COPY FILE 'C:\Aron\AllZip\'+ laFileListP[nFiles,1] TO 'c:\Aron\Hold\'+ laFileListP[nFiles,1] gLogMESS= "*" DO WriteLog gLogMESS= "*AMCTIMER Possible Recovery- File moved to Hold: "+ laFileListP[nFiles,1]+ " "+AllTrim(TTOC((DateTime()))) Do WriteLog gLogMESS= "*" DO WriteLog ENDFOR nFile = ADIR(laFileListP, 'C:\Aron\AllTemp\*.*') FOR nFiles= 1 TO nFile @ 7, 30 Say "ALLTEMP put on HOLD!" COPY FILE 'C:\Aron\AllTemp\'+ laFileListP[nFiles,1] TO 'c:\Aron\Hold\'+ laFileListP[nFiles,1] gLogMESS= "*" DO WriteLog gLogMESS= "*AMCTIMER Possible Recovery- File moved to Hold: "+ laFileListP[nFiles,1]+ " "+AllTrim(TTOC((DateTime()))) Do WriteLog gLogMESS= "*" DO WriteLog ENDFOR ENDPROC FUNCTION MakeCursor cAlias= ALIAS() CREATE CURSOR crsWindows(hwnd I, WindTitle C(50)) lhWnd = GetDesktopWindow() lhWnd = GetWindow(lhwnd, GW_CHILD) *___ Iterate through all TOP-Level windows DO WHILE lhWnd > 0 m.WindTitle = GetTitle(lhWnd) IF NOT EMPTY(m.WindTitle) m.hwnd = lhWnd m.Style = GetWindowLong(lhWnd, GWL_STYLE) m.hex = TRANSFORM(m.Style, "@0") * Check if window is visible and isn't WS_POPUP style IF BITAND(m.Style, WS_VISIBLE) > 0 AND BITAND(m.Style, WS_POPUP) = 0 INSERT INTO crsWindows FROM MEMVAR ENDIF ENDIF * Get next window in Z order lhWnd = GetWindow(lhWnd, GW_HWNDNEXT ) ENDDO SELECT crsWindows lNotAlreadyRunning= .T. SCAN IF SUBSTR(WindTitle, 1, 8)= "ABC CRON" lNotAlreadyRunning= .F. EXIT ENDIF ENDSCAN SELECT &cAlias RETURN lNotAlreadyRunning FUNCTION GetTitle(lhWnd) LOCAL lcTitle lcTitle = Space(512) lnTitle = GetWindowText(lhWnd , @lcTitle, 256) IF lnTitle > 0 lcTitle = Left(lcTitle, lnTitle ) ELSE lcTitle = "" ENDIF RETURN lcTitleData table ARON and notron