Я думаю, что для этого есть несколько способов.
Я думаю, что самым простым является использование таймера, который может быть запущен при запуске службы (или когда ваше приложение запускается, если помещено в меню запуска).
Для этого вы можете использовать метод SetTimer, связанный с сообщением WM_TIMER:
http://msdn.microsoft.com/en-us/library/ms644906(v=vs.85).aspx
Вы должны получить время до запуска таймера, используя функцию CTime, например:
CTime t;
t.GetCurrentTime ();
timeAtLaunched=t.GetSecond(); //or GetHour()
После этого вы можете сделать аналогичный вызов CTime внутри функции таймера, чтобы получить значение currentTime и рассчитать разницу между значением currentTime и значением timeAtLaunched
Чтобы сохранить время соединения в течение дня, если пользователь подключается и отключается несколько раз, вы должны сохранить значение разницы в файле или в реестре.
Для принудительного выхода из системы вы можете использовать:
ExitWindowsEx (EWX_SHUTDOWN | EWX_FORCE, SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
SHTDN_REASON_MINOR_UPGRADE | SHTDN_REASON_FLAG_PLANNED)