我真的很想在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值?
答案 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
方法,允许您从非托管内存中读取。