如何检查计算机是否已锁定/休眠?

4

在C语言中,是否有函数可用于检查计算机是否正在进入睡眠休眠锁定状态以及从这些状态唤醒?

msdn上,他们提供了C#C++的相关内容,但没有C的。

以下是我正在使用的代码,用于检查启动程序和终止程序(关闭系统将终止程序,因此可以测量时间持续时间)之间的时间持续时间。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include<time.h>
clock_t start_time=0;
void bye (void)
{
    FILE *read,*write;
    write=fopen("F:\\count.txt","w");
    clock_t end_time=clock();
    fprintf(write,"Time: %d",(end_time-start_time)/CLOCKS_PER_SEC);
    fclose(write);
}

int main (void)
{
     start_time=clock();     
  atexit (bye);
  //exit (EXIT_SUCCESS);
  getch();
}

同样,我想检查锁定/睡眠/休眠状态。

一种可能的方法是将链接中提供的c++代码包装在C语言中,如@ddriver所述。

但是,在C中完全不可能吗?


当处理器处于睡眠状态时,您希望在何处/如何运行该函数? - user3528438
这就像是如何检查你是否死亡。如果你已经死了,你能做到吗? - dtech
链接的示例代码使用操作系统的事件(或信号)来处理电源模式的更改,这取决于平台和操作系统。 - Nikos M.
其实有一种方法可以做到:在已知的时间间隔内检查系统时钟。如果两次测量的系统时钟之间存在很大的时间差,那么这意味着在现在和上一次测量之间的某个时间点,系统进入了睡眠状态并重新唤醒。如果你选择的测量间隔小于最快可能的睡眠/唤醒周期,那么这种方法就非常实用。 - user3528438
1
抱歉,我忘记添加操作系统了。已更新问题。不管怎样,这是MSDN,所以操作系统是Windows。 - Anurag Chakraborty
显示剩余5条评论
2个回答

7

WinAPI通常至少具有与.NET Framework相同的功能。您要求的是PowerManagement API

您将需要使用RegisterPowerSettingNotification函数注册以接收PowerSettingNotificationEvents。不幸的是,它在GUI应用程序中的使用方式与非GUI(通常是服务)中的使用方式不同。GUI应用程序需要提供一个窗口句柄,该窗口将每次系统即将更改状态(挂起模式或休眠模式之一)时接收WM_POWERBROADCAST消息;而非GUI应用程序则需要使用dwControl参数为SERVICE_CONTROL_POWEREVENT,dwEventType为PBT_POWERSETTINGCHANGE的HandlerEx回调函数进行注册。


我必须承认,这个答案远非完整,但它提供了指向MSDN和要使用的函数、消息和回调类型的指针。一个完整的答案会更长,超出了我的能力范围。希望它能帮助开始编写一些代码,这样下一个问题将更精确,更容易回答,并得到更清晰和有文档支持的响应。 - Serge Ballesta

2
您提供的链接是关于信号在电源模式改变时发出的。因此,您可以检查系统即将进入睡眠状态还是刚刚唤醒。
至于检查系统当前是否处于睡眠状态,则根本不可能,因为用户代码在深度睡眠状态下根本不会运行。也许有一些平台特定的、非常低级别的BIOS API,但这些通常不公开,并且很难移植。

但是在C#中,我们能够做到这一点。在这个网站上,我们有一个答案。 https://dev59.com/imMl5IYBdhLWcg3wr4rn 那么为什么不在C语言中呢? - Anurag Chakraborty
@AnuragChakraborty - 请再检查一下,不是那个问题。该链接是关于检测系统从睡眠中唤醒的情况,而不是检测系统是否正在睡眠... - dtech
顺便提一下,您可以将您回答中的C++代码进行封装,以便从C中使用。 - dtech
抱歉,实际上我想计算电脑有效运行的时间。因此,我需要知道它何时进入睡眠状态以及何时唤醒。 - Anurag Chakraborty
@AnuragChakraborty 好的,那么你可以使用C++示例代码,将其封装成一个带有不透明指针和函数的C API,并使用电源模式更改信号来正确计算运行时间。 - dtech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接