Pio*_*app 13 c# winapi windows-8
我试图从C#访问应用程序历史记录.我想提供与任务管理器相同的信息,但我找不到api/example.当然,我实现了一个桌面应用程序.
指定问题:我对CPU/RAM不感兴趣.我唯一想要的是时间.
更新
要准确显示我在说什么,请看这个屏幕:

问题描述缺乏您正在谈论的Metro Apps的详细信息.该解决方案相当于Process.TotalProcessorTimeMetro Apps.
不幸的是,您无法获取该信息,因为您声明应用程序正在另一个进程(WWAHost.exe)中运行.Metro的设计有点像手机 - 你不能以同样的方式直接操作系统.Windows运行时中没有直接的"进程"(参见此处),这反过来意味着进程类对端口没有意义......
我假设The only thing I would like to get is Time.你指的是每个过程的开始和结束时间
最好的方法是你必须建立自己的历史.如果您只在应用程序运行时需要历史记录,那么您只需实现代码,否则如果您希望构建历史记录一段时间,即使应用程序已关闭,也请尝试创建一个为您完成工作的Windows服务.以下是您需要做的步骤,假设您知道如何创建Windows服务项目,编译并安装它:
获取运行流程信息:
using System;
using System.Diagnostics;
public static class ProcessStart
{
Process[] runningProcesses;
var processesStartTimes = new Dictionary<int, Datetime>();
var processesExitTimes = new Dictionary<int, Datetime>();
static ProcessStart()
{
// This will get current running processes
runningProcesses = Process.GetProcesses();
foreach (var p in processes)
{
p.Exited += new EventHandler(ProcessExited);
processesStartTimes.Add(p.Id, p.StartTime);
}
}
private void ProcessExited(object sender, System.EventArgs e)
{
var p = (Process)sender;
processesExitTimes.Add(p.Id, p.ExitTime);
}
}
Run Code Online (Sandbox Code Playgroud)
获得新的启动流程
您需要创建一个新Timer对象并每秒运行一次,检查新创建的进程.我复制了上面的代码并对其进行了扩展:
public static class ProcessStart
{
Process[] runningProcesses;
var processesStartTimes = new Dictionary<int, Datetime>();
var processesExitTimes = new Dictionary<int, Datetime>();
var updateTimer = new Timer(1000);
static ProcessStart()
{
// This will get current running processes
runningProcesses = Process.GetProcesses();
foreach (var p in processes)
{
p.Exited += new EventHandler(ProcessExited);
processesStartTimes.Add(p.Id, p.StartTime);
}
updateTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
}
private void ProcessExited(object sender, System.EventArgs e)
{
var p = (Process)sender;
processesExitTimes.Add(p.Id, p.ExitTime);
}
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
runningProcesses = Process.GetProcesses();
foreach (var p in processes)
{
// This will only add the processes that are not added yet
if (!processesStartTimes.Keys.Contains(p.Id))
{
p.Exited += new EventHandler(ProcessExited);
processesStartTimes.Add(p.Id, p.StartTime);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后:
那你就需要System.Diagnostics.Process上课了.这应该是获取有关Windows进程所需的所有信息的最佳方式.它将授予您访问各种属性和方法的权限.这是官方的MSDN喜欢它:
编辑:
正如我从您的评论中看到的那样,您对CPU运行特定进程所花费的时间感兴趣.同一个System.Diagnostics.Process类也包含该信息.可以使用该Process.PrivilegedProcessorTime属性找到.此属性的MSDN描述为:
TimeSpan,指示进程在操作系统核心内运行代码所花费的时间.
更多信息在这里
编辑2:
以下2个属性也可能为您提供所需的内容:
Process.UserProcessorTime:这里
TimeSpan,指示关联进程在进程的应用程序部分(不在操作系统核心内)中运行代码所花费的时间.
Process.TotalProcessorTime:这里
TimeSpan,指示关联进程使用CPU所花费的时间.此值的总和UserProcessorTime及PrivilegedProcessorTime.
我对此做了一些研究,因为我发现 Metro 应用程序如何集成到现有的流程结构中很有趣。
正如其他人在这里指出的那样,不可能以受支持的漂亮 API 方式获取您想要的信息。然而,每个应用程序都是作为不同的进程启动的,对于进程来说,有已知的方法来获取运行时间、CPU 时间等。
如果您找到与您的 Windows 8 应用程序相对应的进程,您将能够获得您需要的信息。
有些应用程序确实很容易被发现。它们只是一个可执行文件,就像任何其他桌面应用程序一样,具有正确的进程名称和描述。例如这张图片中的“地图”、“Windows Reader”和“Microsoft 相机应用程序”:

其他一些应用程序有点难以发现。它们托管在由可执行程序启动的进程中wwahost.exe。我只能通过查看模块列表来找到应用程序名称。这是Bing应用程序:

要枚举进程中的模块和映射文件,您可以使用 WinAPI VirtualQueryEx和GetMappedFileName。
然后您想要查找位于 的文件%programfiles%\WindowsApps。这是 Windows 保存其应用程序的所有应用程序文件的文件夹。
每个应用程序都有一个.pri文件。该文件包含应用程序的二进制元数据。您可以使用它从托管应用程序的进程中查找应用程序的名称。在 .pri 文件所在的同一文件夹中,AppxManifest.xml您可以在其中找到有关该应用程序的各种附加信息。
我将尝试总结一下我的写作:
ressources.pri. 该文件所在的目录中有应用程序名称。AppxManifest.xml文件以获取有关该应用程序的其他信息。您可能需要管理员权限或其他权限才能读取此文件。