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