我不知道有任何“已批准”的 API 可以从 Windows 应用商店应用程序中获取此信息。
但是,如果您只想在测试应用程序中执行此操作,则可以使用“未经批准”的 API。如果你使用未经批准的 API,你的程序将无法通过 WACK 认证,无法上传到商店,但在本地进行测试是可以的。请注意,当您调用未经批准的 API 时无法保证,因此该行为在形式上是未定义的,但许多函数都可以正常工作——至少在当前版本中是这样。
AllocConsole
我在今年夏天早些时候写的一篇文章“Metro 风格应用程序中的 printf 调试”中演示了如何调用。您可以在 C# 中执行类似的操作,使用 P/Invoke 调用本机函数,或编写可从 C# 调用的 C++ Windows 运行时组件。
对于您的场景,我建议调用GetCurrentProcess
以获取当前进程的句柄并将其传递给以GetProcessTimes
获取用户和内核时间。我进行了一个简短的测试,并用这种方法得到了合理的结果。
这是一个使用 P/Invoke 进行调用的完整 C# 类:
static class DebugProcessTimes
{
[StructLayout(LayoutKind.Sequential)]
private struct FileTime
{
public UInt32 Low;
public UInt32 High;
}
private static UInt64 ToUInt64(FileTime time)
{
return ((UInt64)time.High << 32) + time.Low;
}
[DllImport("kernel32.dll")]
private static extern IntPtr GetCurrentProcess();
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetProcessTimes(
IntPtr hProcess,
out FileTime lpCreationTime,
out FileTime lpExitTime,
out FileTime lpKernelTime,
out FileTime lpUserTime);
public struct ProcessTimes
{
public UInt64 CreationTime;
public UInt64 ExitTime;
public UInt64 KernelTime;
public UInt64 UserTime;
}
public static ProcessTimes GetProcessTimes()
{
FileTime creation, exit, kernel, user;
if (!GetProcessTimes(GetCurrentProcess(),
out creation, out exit, out kernel, out user))
throw new Exception(":'(");
return new ProcessTimes
{
CreationTime = ToUInt64(creation),
ExitTime = ToUInt64(exit),
KernelTime = ToUInt64(kernel),
UserTime = ToUInt64(user)
};
}
}
用法:
var times = DebugProcessTimes.GetProcessTimes();