如何使用CallNtPowerInformation(使用Interop)获取Windows SystemExecutionState?

时间:2012-04-22 13:40:32

标签: c# interop pinvoke

我真的很想在C#中使用CallNtPowerInformation函数。我需要获得Windows SystemExecutionState。 (可能的值listed here)。

我找到了合适的C#签名:

    [DllImport("powrprof.dll", SetLastError = true)]

    private static extern UInt32 CallNtPowerInformation(
         Int32 InformationLevel,
         IntPtr lpInputBuffer,
         UInt32 nInputBufferSize,
         IntPtr lpOutputBuffer,
         UInt32 nOutputBufferSize
         );

现在我需要使用信息级别16来读取“SystemExecutionState”。这是我到目前为止的代码:

IntPtr status = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(ulong)));
UInt32 returnValue = CallNtPowerInformation(
    16, 
    (IntPtr)null, 
    0, 
    status, (
    UInt32)Marshal.SizeOf(typeof(ulong)));
Marshal.FreeCoTaskMem(status);

根据Microsoft文档:

  

lpOutputBuffer缓冲区接收包含系统的ULONG值   执行状态缓冲区。

如何从IntPtr获取ULONG值?

2 个答案:

答案 0 :(得分:2)

使用out uint代替IntPtr

[DllImport("powrprof.dll", SetLastError = true)]
private static extern UInt32 CallNtPowerInformation(
     Int32 InformationLevel,
     IntPtr lpInputBuffer,
     UInt32 nInputBufferSize,
     out uint lpOutputBuffer,
     UInt32 nOutputBufferSize
);


uint result;
CallNtPowerInformation(..., out result);

答案 1 :(得分:1)

致电Marshal.ReadInt32(status)获取价值。

uint statusValue = (uint)Marshal.ReadInt32(status);

Marshal类有一整套ReadXXX方法,允许您从非托管内存中读取。