C# 如何使用 CallNtPowerInformation 和 Interop 来获取 SYSTEM_POWER_INFORMATION

2024-05-16

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

我相信那么我需要创建一个结构系统电源信息 http://msdn.microsoft.com/en-us/library/windows/desktop/aa373217%28v=vs.85%29.aspx处理结果?

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 如何使用 CallNtPowerInformation 和 Interop 来获取 SYSTEM_POWER_INFORMATION 的相关文章

  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 将 System.Windows.Forms.Keys 序列转换为 Char

    有没有办法转换由 Keys 枚举表示的击键序列 即System Windows Forms Keys 在一个字符中 例如 Keys Oem4进而Keys A产生 char 它一定存在于 WinAPI 中的某个地方 因为当我在文本框中按下按键
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何在.NET Core上直接调用F#编译器?

    UPD 我想直接从 NET Core SDK 调用 F 编译器 即 fsc 我了解 dotnet build co 但当我只需要编译一个简单的问题时 即 fsc file fs 就足够的情况下 我不想涉及它们 我尝试在 NET Core S
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • 可视化 TFLite 图并获取特定节点的中间值?

    我想知道是否有办法知道 tflite 中特定节点的输入和输出列表 我知道我可以获得输入 输出详细信息 但这不允许我重建发生在Interpreter 所以我要做的是 interpreter tf lite Interpreter model
  • asp.net web api 自托管/owin/katana

    我对自托管有多个问题 自托管 Nuget 有 2 个 nuget 提供自托管 Microsoft AspNet WebApi OwinSelfHost and Microsoft AspNet WebApi SelfHost 那么微软有2种
  • 在 64 位操作系统上以 32 位运行 IIS 与以 64 位运行 IIS 有何优缺点?

    可能更适合 机架溢出 但从开发人员的角度来看 在 64 位 Windows 主机上将 IIS 同时服务于传统经典 ASP 和 NET 作为 32 位进程而不是 64 位进程运行有哪些优点和缺点 32 64 iis 服务器 相对于 32 32
  • 使用 cmake 处理头文件依赖关系

    我正在一个小型 C 项目上使用 CMake 到目前为止 它运行得很好 有一点点 x 当我更改头文件时 通常需要重新编译许多源文件 直接或间接包含它的文件 但是 cmake 似乎只检测到some的源文件被重新编译 导致损坏状态 我可以通过清除
  • 在循环中使用 NUnit Assert 时,如何在错误消息中显示更多信息?

    考虑以下代码 Test public void WidgetTest foreach Widget widget in widgets Assert AreEqual 0 widget SomeValue 如果其中一个断言失败 我将收到一条
  • Android 布局不需要的填充

    所以我有这个布局文件 如下 正如您所看到的 没有填充或边距 dimen xml 文件也没有任何填充 边距 最后 我根本不以编程方式更改布局
  • 在具有不同边框的 div 上调用函数

    我有一个div对于一个名为 ball 的类 div 的每个边缘都有一个边框 顶部边框 左侧边框等 当用户单击每个边框上的边框时 我想用 JavaScript 触发不同的事件 例如 用户点击边框顶部console log top 等等 HMT
  • 在shell命令行中创建mysql触发器

    我需要在命令行中创建一个mysql触发器 这个sql在mysql控制台中运行良好 sql USE DB1 DROP TRIGGER IF EXISTS my trigger DELIMITER CREATE TRIGGER my trigg
  • Django 2.0 haystack 更新索引,重建索引抛出错误

    我使用 django 2 0 和 haystack whoosh 作为搜索 我按照文档中的说明进行配置 发生的问题是当我跑步时 manage py rebuild index它显示此错误 Traceback most recent call
  • 多选复选框下拉

    我正在使用多选复选框下拉菜单 请看例子jsfiddle http jsfiddle net manthan11 qqhczbvs 6 function lstStates multiselect 选择州后 它会显示 TEXT 值并用逗号连接
  • PHP服务器端IAB验证openssl_verify总是返回0

    我使用以下函数 服务器端 php 来验证 IAB v3 事务 我从 Android 应用程序传递过来 Override protected void onActivityResult int requestCode int resultCo
  • 使用 jquery fullCalendar 时,为什么我在切换月份后看到重复的事件?

    I am 使用 jquery fullCalendar 插件 http arshaw com fullcalendar 我遇到了一个奇怪的问题 当我加载第一个月 在本例中为 2013 年 12 月 时 它工作正常 我调用我的 ajax 事件
  • AngularJS - RouteProvider 解析调用服务方法

    我创建了一项检查用户登录状态的服务 如果令牌存在 则登录用户 否则重定向到登录页面 最初我通过routeProvider解析调用了这个服务 这一次就可以完美工作 但是由于Angularjs服务是单例的 因此测试不会针对连续调用运行 然后 我
  • XHTML 和文本区域内的代码

    在我的一个使用文本区域进行提交的网站上 我的代码可以显示如下所示的内容
  • 如何从 Ruby 程序发送邮件?

    我想从 Ruby 应用程序发送电子邮件 核心语言中是否有调用来执行此操作 或者是否有我应该使用的库 最好的方法是什么 如果你不想使用行动邮递员 http wiki rubyonrails org rails pages ActionMail
  • 擦除-删除习惯用法的性能增益来自哪里

    我需要从向量中删除满足特定条件的所有元素 我的第一种方法是循环遍历向量并对满足条件的所有元素调用 vector erase 据我所理解 vector erase对于这个用例来说 性能很差 因为它从底层数组中删除了该项目 并将向量的其余部分向
  • 如何使用 HTML5 地理位置查找用户所在的国家/地区?

    我熟悉 HTML5 地理定位 用于返回用户位置的粗略坐标 但是 如何返回其坐标所在国家 地区的名称 如果你只想要这个国家 这里有一个更简单的方法 使用ws geonames org http ws geonames org而不是谷歌 if
  • 将 dapper.net 的存储过程输出转换为列表

    我是 Dapper net 的新手 我正在尝试使用 Dapper Net 执行存储过程 我有一个模特班StoredProcedureResult 与存储过程的输出相关 public StoredProcedureResult public
  • 如何将更改移出主分支

    基本问题 但这一直发生在我身上 进行更改working branch 切换到master git merge working branch git push cap deploy 到舞台 泡一杯新茶 然后我回来思考其他事情并开始做出一些改变
  • C# 如何使用 CallNtPowerInformation 和 Interop 来获取 SYSTEM_POWER_INFORMATION

    我正在尝试编写一个小程序 该程序作为服务运行并监视用户是否处于活动状态 如果用户空闲 没有鼠标 键盘 一个小时 则某些进程将被终止 如果用户使用 user32 dll 中的 LASTINPUTINFO 运行它 它就可以工作 但它不能作为服务