用CallNtPowerInformation

用CallNtPowerInformation

我正在尝试编写一个作为服务运行的小程序,并监视用户是否处于活动状态。如果用户闲置一个小时(没有鼠标/键盘),则某些进程将被杀死。如果它是由用户使用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致歉

最佳答案

您可以像这样获得所需的信息:

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();
        }
    }
}


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

关于c# - C#如何与Interop一起使用CallNtPowerInformation获取SYSTEM_POWER_INFORMATION,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20407094/

10-09 01:39