C: 如何检查电脑是不是被锁定/睡眠?
Posted
技术标签:
【中文标题】C: 如何检查电脑是不是被锁定/睡眠?【英文标题】:C: How to check if the computer is locked/sleep?C: 如何检查电脑是否被锁定/睡眠? 【发布时间】:2015-08-18 18:32:43 【问题描述】:C 中是否有任何函数可以检查计算机是否将进入sleep
、hibernate
或locked
并从这些状态中唤醒?
在msdn 中,他们提供了C#
、C++
,但没有提供C
。
我的操作系统是windows7
下面是我用来检查程序启动和终止之间持续时间的代码(关闭系统将终止程序,因此可以测量持续时间)。
#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();
以同样的方式我想检查锁定/睡眠/休眠。
@ddriver 提到的将 c++ 代码(在链接中提供)包装在 c 中的一种可能方法
但在 C 中根本不可能吗?
【问题讨论】:
棘手的问题,这取决于 C 代码运行的模式、使用的操作系统等。例如在睡眠模式下,某些进程(包括 c 代码)也会睡眠,因此无法运行并检查睡眠模式,此外,睡眠模式有多种实现方式需要根据平台和操作系统进行检查 当处理器处于休眠状态时,您希望函数如何/在哪里运行? 这就像如何检查你是否已经死了。如果你死了,你能做到吗? 您链接到的示例代码,使用来自操作系统的事件(或信号)来处理电源模式发生变化,这同样取决于平台和操作系统 对不起,我忘了添加操作系统。更新了问题。无论如何它是 msdn 所以操作系统是 windows。 【参考方案1】:WinAPI 通常至少具有与 .NET 框架相同的可能性。您要的是PowerManagement API。
您必须注册才能使用RegisterPowerSettingNotification
功能接收PowerSettingNotificationEvents。不幸的是,它在 GUI 应用程序中的使用方式不同,在该应用程序中,您为窗口提供句柄,然后在每次系统即将更改状态(挂起模式或休眠模式之一)时收到 WM_POWERBROADCAST
消息,以及使用 SERVICE_CONTROL_POWEREVENT 的 dwControl 参数和 PBT_POWERSETTINGCHANGE 的 dwEventType 注册 HandlerEx
回调的非 GUI(通常是服务)。
【讨论】:
我必须承认,如果这个答案远未完成,但它提供了指向 MSDN 以及要使用的函数、消息和回调类型的指针。完整的答案会更长,而且超出我目前的能力。希望它有助于开始一些代码,以便接下来的问题将更准确,更容易回答更清晰和记录的响应。【参考方案2】:您提供的链接是关于在电源模式更改时发出的信号。因此,显然,您可以检查系统何时即将进入睡眠状态,或者它刚刚醒来。
在检查系统当前是否处于睡眠状态时,这是不可能的,因为用户代码在深度睡眠状态下根本不会运行。可能是一些特定于平台的、非常低级的 Bios API,但这些 API 通常不公开,而且远非可移植。
【讨论】:
但是在 C# 中我们可以做到。在这个网站上,我们有一个答案。 ***.com/questions/18206183/… 那么为什么不用 C 语言呢? @AnuragChakraborty - 再次检查,不是那样的。该链接是关于检测系统何时从睡眠中唤醒,而不是检测系统是否正在睡眠...... 顺便说一句,您可以将答案示例中的 C++ 代码包装起来,以便在 C 中使用。 对不起,实际上我想计算计算机有效运行的时间。所以为此我需要知道它什么时候睡觉和什么时候醒来 @AnuragChakraborty 好吧,在这种情况下,您可以使用 C++ 示例代码,使用不透明的指针和函数将其包装到 C API 中,并使用电源模式更改信号来正确计算运行时间。以上是关于C: 如何检查电脑是不是被锁定/睡眠?的主要内容,如果未能解决你的问题,请参考以下文章