I am a newbie to C++ and wanted to create a Screentime application like in ios for windows. But unfortunately, I am stuck after creating the default bootstrap by using visual studio 2019. Can anyone suggest to me what I should do next and other related resources? I just wanted to create a simple app (let's say screentime) that monitors other apps active and focused state whenever the screentime app is run and store the app name, start time and end time in a text file.
-
**Programming Windows** by Charles Petzold has been the *go to* book for learning Windows programming for many Windows developers. It'll tremendously help you get underway. – Eljay Aug 10 '21 at 14:58
-
@Eljay agree that it's a well done book but there's nothing on `setwindowshookex()` there. – Алексей Неудачин Aug 10 '21 at 15:38
1 Answers
The following Windows APIs should help with this:
GetForegroundWindow
will return the window the user is currently working in.GetWindowThreadProcessId
will retrieve the process ID corresponding to that window.There's an answer here which shows how to map the process ID to a process name.
It's then a matter of doing this periodically on a timer to keep track of the current application and logging the results.
As noted in the comments, there is a better way to track when the foreground window changes. You can use SetWinEventHook
to install a handler to listen for such changes and then take the desired action in your handler when it does.
You would call SetWinEventHook
like this:
HWINEVENTHOOK hHook = SetWinEventHook (EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND,
NULL, MyEventHandler, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
Where MyEventHandler
would be declared like this:
void CALLBACK MyEventHandler (
HWINEVENTHOOK hWinEventHook,
DWORD event,
HWND hwnd,
LONG idObject,
LONG idChild,
DWORD idEventThread,
DWORD dwmsEventTime
)
{ ... }
And hwnd
is passed as the new foreground window.
Finally, pass hHook
to UnhookWinEvent
before exiting your application (or when the hook is no longer needed).

- 594
- 1
- 6
- 20

- 24,133
- 4
- 26
- 48
-
https://stackoverflow.com/questions/20618720/is-there-any-system-event-which-fires-when-getforegroundwindow-changes How i said early haha – Алексей Неудачин Aug 10 '21 at 15:50
-
[SetWinEventHook](https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwineventhook) is the correct way to do this. No need to periodically ask *"Are we there yet?"*. Just have the system set an alarm for you, and you won't sleep right through the interesting parts. – IInspectable Aug 10 '21 at 16:22