It's ok to buy B+ since it offres a lot of useful things for apps not found in B3D, but I think what you need is dead simple and could be done in blitz easily.
It isn't that hard to get into simple API Calls using Blitz .decls.
You need the command ShowWindow that can be used to make the Blitz app invisible. Blitz will not use that big lot of memory, compared to a preloaded MSIE in memory or something, I wouldn't worry too much about it. Blitz is not using too much of CPU power if you use the "delay" command in a clever way.
All you have to do is:
Run the app in windowed mode
Using ShowWindow hwnd,0 to hide the task
delay 10000
check if it's time for a new .CTA Check (every 20 Minutes as you say)
if so, read the directory and search for the .CTA files
if you want to know if a file with the same name has been edited sine the last time then check the checksum
.decls: these are files you have to store inside the "userlibs" folder of your Blitz3D folder.
they contain definitions of Api (and other DLL) -calls you want to be accsessible in Blitz. They start with the definition of the DLL that contains the calls. A list of call-commands then follows.
the ShowWindow call needs to be defind this way:
Since the Windows System-API call "ShowWindow" is part of the "user32.dll" Dynamic Link Library ou have to use a file named "user32.decls" for this. The file looks like this:
.lib "user32.dll"
FindWindow%( class$,Text$ ):"FindWindowA"
ShowWindow(hwnd%,nCmdShow%)
GetActiveWindow%()
GetDC%(hWnd% )
ReleaseDC%(hWnd%,hDC%)
GetDesktopWindow%()
GetSystemMetrics%(nIndext%)
GetWindowTextLength%(hwnd):"GetWindowTextLengthA"
GetWindowText%(hwnd%,buff*,anzahl%):"GetWindowTextA"
SetWindowText(hwnd%,buffer$):"SetWindowTextA"
So here you can see the command ShowWindow along with some other useful Api-calls.
One important thing with Api calls is the "hwnd" which is the window-handle of the running app. If your app want to use Api-calls to midify itself then it needs to know its own Window-Handle. There are several ways to determine the hwnd, the esiest would be to call GetActiveWindow(), but it is not very secure since an other window could become "the active window" meanwhile. It's better to use FindWindow that is using the app class and the app title.
the class is diffrent with the several Blitz Products, however, here is the code to hide the window:
; Const class$="GX_WIN32_CLASS" ; <- BlitzPlus 1.11
; Const class$="BLITZMAX_WINDOW_CLASS" ; <- BlitzPlus 1.34
Const class$="Blitz Runtime Class" ; <- Blitz3D
Global title$="My Blitz Window" ; starting title
AppTitle title$
hwnd=FindWindow(class$,title$)
WaitKey()
Delay 500
FlushKeys()
ShowWindow hwnd,0 ; hide it
; do anything in the background
Delay 5000
ShowWindow hwnd,1 ; show it
WaitKey()
End
I hope this helps.