【问题标题】:How to record screentime in c++? [closed]如何在 C++ 中记录屏幕时间? [关闭]
【发布时间】:2021-08-10 14:53:19
【问题描述】:

我是 C++ 的新手,想在 ios 中为 windows 创建一个 Screentime 应用程序。但不幸的是,我在使用 Visual Studio 2019 创建默认引导程序后被卡住了。任何人都可以向我建议下一步我应该做什么以及其他相关资源吗? 我只是想创建一个简单的应用程序(比如说 screentime),它可以在 screentime 应用程序运行时监控其他应用程序的活动和聚焦状态,并将应用程序名称、开始时间和结束时间存储在文本文件中。

【问题讨论】:

  • Programming Windows 由 Charles Petzold 撰写,是许多 Windows 开发人员学习 Windows 编程的go to书籍。它将极大地帮助您开始。
  • @Eljay 同意这是一本做得很好的书,但setwindowshookex() 上没有任何内容。

标签: c++ windows winapi


【解决方案1】:

以下 Windows API 应该可以帮助解决这个问题:

  1. GetForegroundWindow 将返回用户当前正在工作的窗口。

  2. GetWindowThreadProcessId 将检索对应于该窗口的进程 ID。

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

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


正如 cmets 中所述,有一种更好的方法可以跟踪前景窗口何时发生变化。您可以使用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 被作为新的前台窗口传递。

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

【讨论】:

猜你喜欢
  • 2017-06-15
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 2017-12-05
相关资源
最近更新 更多