如何在 C++ 中记录屏幕时间?

How to record screentime in c++?

我是 C++ 的新手,想为 windows 创建一个类似于 ios 中的 Screentime 应用程序。但不幸的是,在使用 visual studio 2019 创建默认值 bootstrap 后,我被卡住了。任何人都可以向我建议我下一步应该做什么和其他相关资源吗? 我只是想创建一个简单的应用程序(比方说屏幕时间),只要屏幕时间应用程序 运行 就会监视其他应用程序的活动和聚焦状态,并将应用程序名称、开始时间和结束时间存储在文本文件中。

以下 Windows API 应该对此有所帮助:

  1. GetForegroundWindow 将 return 用户当前正在工作的 window。

  2. GetWindowThreadProcessId 将检索对应于 window.

    的进程 ID
  3. 有一个答案,其中显示了如何将进程 ID 映射到进程名称。

然后就是在计时器上定期执行此操作以跟踪当前应用程序并记录结果。


如评论中所述,有一种更好的方法来跟踪前景 window 何时发生变化。您可以使用 SetWinEventHook 安装处理程序来侦听此类更改,然后在处理程序中执行所需的操作。

您可以这样调用 SetWinEventHook

HWINEVENTHOOK hHook = SetWinEventHook (EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND,
    NULL, MyEventHandler, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);

其中 MyEventHandler 会这样声明:

void CALLBACK MyEventHandler (
  HWINEVENTHOOK hWinEventHook,
  DWORD event,
  HWND hwnd,
  LONG idObject,
  LONG idChild,
  DWORD idEventThread,
  DWORD dwmsEventTime
)
{ ... }

并且hwnd作为新的前景被传递window。

最后,在退出应用程序之前(或不再需要挂钩时)将 hHook 传递给 UnhookWinEvent