C#如何使用Interop的CallNtPowerInformation获取SYSTEM_POWER_INFORMATION

时间:2013-12-05 17:48:42

标签: c# .net winapi pinvoke

我正在尝试编写一个作为服务运行的小程序,并监视用户是否处于活动状态。如果用户闲置一小时(没有鼠标/键盘),则会杀死某些进程。如果用户使用user32.dll中的LASTINPUTINFO运行它,它会工作,但它不能用作服务。进一步观察我遇到有人说要用SystemPowerInformation调用CallNtPowerInformation并检查TimeRemaining成员。我想这样做,但对互操作很少有经验,并希望得到一些帮助/示例:

在C#中我会导入:

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

我相信我需要为SYSTEM_POWER_INFORMATION创建一个结构来处理结果吗?

为n00bness道歉

1 个答案:

答案 0 :(得分:1)

您可以获得所需的信息:

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        const int SystemPowerInformation = 12;
        const uint STATUS_SUCCESS = 0;

        struct SYSTEM_POWER_INFORMATION
        {
            public uint MaxIdlenessAllowed;
            public uint Idleness;
            public uint TimeRemaining;
            public byte CoolingMode;
        }

        [DllImport("powrprof.dll")]
        static extern uint CallNtPowerInformation(
            int InformationLevel,
            IntPtr lpInputBuffer,
            int nInputBufferSize,
            out SYSTEM_POWER_INFORMATION spi,
            int nOutputBufferSize
        );

        static void Main(string[] args)
        {
            SYSTEM_POWER_INFORMATION spi;
            uint retval = CallNtPowerInformation(
                SystemPowerInformation,
                IntPtr.Zero,
                0,
                out spi,
                Marshal.SizeOf(typeof(SYSTEM_POWER_INFORMATION))
            );
            if (retval == STATUS_SUCCESS)
                Console.WriteLine(spi.TimeRemaining);
            Console.ReadLine();
        }
    }
}

我无法告诉您此方法是否会为您提供从服务运行时所需的信息。