【问题标题】:Accessing windows 10 task manager process list访问 Windows 10 任务管理器进程列表
【发布时间】:2020-09-09 18:14:35
【问题描述】:

当涉及到 Windows 7 任务管理器时,我很容易获得进程计数等,因为进程存储在传统的列表视图控件中,我可以使用 SendMessage 函数访问该控件。然而,对于 explorer/win10 任务管理器/等,存储进程的列表控件似乎不是传统控件,似乎是自定义控件。我想知道是否有关于 Microsoft 在其较新的系统应用程序中使用的自定义控件的任何文档,和/或我是否可以使用 SendMessage 或类似我之前所做的类似的东西访问它们?

 //Get the handle of the list..you can find the handle in win7&10 pretty easily
 FindWindowExA(...parent,IntPtr.Zero,"SysListView32","Processes");//=listview handle
 
 //Sending a message to get the number of processes for instance, works in windows 7 only
 SendMessageA(process list handle,(IntPtr)0x1004,IntPtr.Zero,null);//=process count

如果没有,是否值得尝试调试我自己如何访问列表,或者这是一个坏主意?为什么?我有一个 c# 应用程序,使用 PInvoke 移植 C++ 方法没有问题。谢谢

【问题讨论】:

  • 您能选择一种语言吗?
  • 为什么要从任务管理器中获取该列表?只需使用docs.microsoft.com/en-us/windows/win32/psapi/…
  • 从任务管理器获取进程列表听起来很……奇怪。为什么不能通过代码stackoverflow.com/questions/648410/… 正常执行此操作?
  • Alexei Levenkov 我不想只获取进程列表。我想访问进程列表(包括内存、cpu 等)的控制句柄,并让我可以完全访问列表视图,就像我之前对 Windows 7 所做的那样,此外,列表非提升任务管理器上显示的进程数有时与 Process.GetProcesses().Where(owner==environment.username) 不同,因此更准确。不管我的目标是不可变的
  • (题外话:当你删除它时,我正要回答你的另一个问题stackoverflow.com/questions/64070927/…。它可能是重复的,所以不能重新打开,但godbolt.org/z/rcWcox 表明编译器在练习。有关内存源操作数性能的更多信息,另请参阅Micro fusion and addressing modesagner.org/optimize。)

标签: c# c++ windows


【解决方案1】:

不要那样做。任务管理器没有做任何魔术。它使用 Windows API 来获取进程列表、枚举它并获取详细信息。你正在做的事情实际上比简单地复制任务管理器在内部做的事情更难。 Process Status API (psapi) 是一个很好的起点,还有其他 API 可以获取资源使用信息等。所有需要弄清楚的是“漫步”WINAPI 文档(诚然,这里和那里很少)。如果有疑问,请使用调试器中断任务管理器并查看它调用了哪些 API,或使用depends 工具查看它使用了哪些 API,以便您了解在哪里查看。您还可以使用 IDA-Pro 等逆向工程工具进行部分反汇编并查找 API 调用。

【讨论】:

  • 我会使用什么调试器来解决这个问题?
  • 普通的 Visual Studio 调试器。您可以使用它附加到进程。它应该从 Microsoft 的在线服务器中为您的 Windows 版本提取符号,因此 API 和其他库调用将具有有意义的符号名称。
猜你喜欢
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 2011-06-25
  • 2011-08-15
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多