我正在尝试编写一个作为服务运行的小程序,并监视用户是否处于活动状态。如果用户闲置一小时(没有鼠标/键盘),则会杀死某些进程。如果用户使用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道歉
答案 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();
}
}
}
我无法告诉您此方法是否会为您提供从服务运行时所需的信息。