Well here's a little proggi which you can hopefully develop further, it does all you want in a simple sort of way:
#include "stdafx.h"
#include <iostream>
using namespace std;
#define TA_FAILED 0
#define TA_SUCCESS_CLEAN 1
#define TA_SUCCESS_KILL 2
#define TA_SUCCESS_16 3
struct ProgData
{
HANDLE hProc;
DWORD PID;
char* prog;
};
// Stop prog with WM_CLOSE if main window(s) found
BOOL CALLBACK termProgEnum(HWND hwnd,LPARAM lParam)
{
DWORD PID;
GetWindowThreadProcessId(hwnd, &PID);
//cout << "hWnd: " << hwnd << " PID: " << PID << " sought: " << ((ProgData*)lParam)->PID << endl;
if (PID==((ProgData*)lParam)->PID)
{
CloseHandle(((ProgData*)lParam)->hProc);
((ProgData*)lParam)->hProc = NULL;
PostMessage(hwnd, WM_CLOSE, 0, 0);
}
return TRUE;
}
// Terminate the process with WM_CLOSE or TerminateProcess() after timeout interval
int WINAPI termProg(ProgData& pd,DWORD timeout)
{
DWORD ret;
EnumWindows((WNDENUMPROC)termProgEnum,(LPARAM)&pd);
if (WaitForSingleObject(pd.hProc,timeout)!=WAIT_OBJECT_0)
ret = (TerminateProcess(pd.hProc,0)?TA_SUCCESS_KILL:TA_FAILED);
else
ret = TA_SUCCESS_CLEAN;
SYSTEMTIME time;
GetLocalTime(&time);
cout << "Prog ended at " << time.wHour << ":" << time.wMinute << " code: " << ret << endl;
return ret ;
}
// Start process if not running
int startProg(ProgData& pd)
{
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
PROCESS_INFORMATION pi;
DWORD creationFlags = 0;
SYSTEMTIME time;
GetLocalTime(&time);
if ((!pd.hProc)||(WaitForSingleObject(pd.hProc,0)==WAIT_OBJECT_0))
{
// Not running, start the process
ZeroMemory(&sa,sizeof(sa));
sa.nLength = sizeof(sa);
ZeroMemory(&si,sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi,sizeof(pi));
int ret = CreateProcess(NULL,pd.prog,&sa,&sa,FALSE,creationFlags,NULL,NULL,&si,&pi);
if (ret)
{
cout << "Prog started at " << time.wHour << ":" << time.wMinute << endl;
pd.hProc = pi.hProcess;
pd.PID = pi.dwProcessId;
}
else
{
cout << "Prog started failed at " << time.wHour << ":" << time.wMinute << endl;
pd.hProc = NULL;
return -1;
}
}
else
cout << "Prog is running at " << time.wHour << ":" << time.wMinute << endl;
return 0;
}
// Check if prog running start or stop according to status and time
void checkRunning(int sh, int sm, int eh, int em, char* prog)
{
ProgData pd;
int ct;
pd.hProc = NULL;
pd.PID = 0;
pd.prog = prog;
SYSTEMTIME time;
while (true)
{
GetLocalTime(&time);
cout << "Current time: " << time.wHour << ":" << time.wMinute << endl;
cout << "Start at: " << sh << ":" << sm << endl;
cout << "End at: " << eh << ":" << em << endl;
ct = time.wHour*60 + time.wMinute;
if ((ct>= (sh*60+sm))&&(ct<(eh*60+em)))
{
//cout << "Check running" << endl;
if (startProg(pd)) return;
}
else
if (pd.hProc)
{
//cout << "Stop program" << endl;
termProg(pd,5000);
}
Sleep(30000); // Check at 30sec intervals
}
}
int main(int argc, char* argv[])
{
checkRunning(12,15,13,20,"notepad.exe"

;
return 0;
}

Hope that this helped! ;-)