| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1118 人关注过本帖
标题:[求助]如何获得当前Windows系统的状态(正常运行还是正在关机)?
只看楼主 加入收藏
kutbie
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-3-27
收藏
 问题点数:0 回复次数:4 
[求助]如何获得当前Windows系统的状态(正常运行还是正在关机)?

有没有类似的API可以得到系统当前的运行状态呢?
比如是在关机过程中还是正常运行状态?

谢谢!

搜索更多相关主题的帖子: Windows 系统 状态 运行 
2007-06-07 12:10
余来
Rank: 6Rank: 6
等 级:贵宾
威 望:26
帖 子:956
专家分:18
注 册:2006-8-13
收藏
得分:0 
没听说过有过这样的函数,不过到是有关机时的状态获取
在Windows关机或注销的时候会给每个进程传送一个WM_QUERYENDSESSION消息,如果中间有的进程不能顺利的结束,这时该信息执行的结果将返回FALSE,这时Windows将不再继续向后面的进程发送WM_QUERYENDSESSION消息,只有所有的进程都可以顺利的结束,才代表顺利结束.
不管WM_QUERYENDSESSION消息最后是否可以顺利结束,Windows会再向所有的进程传送WM_ENDSESSION消息,而wParam的内容指出是否可以顺利结束如果返回FALSE则Windows将不会退出
只要应用程序响应该消息就可以知道当前系统正在准备关机。

2007-06-07 12:19
kutbie
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-3-27
收藏
得分:0 
感谢兄弟回复。
我现在只能有一个程序隔一个固定时间段被调用一次,没有可能主动去查询系统关机状态么?
2007-06-07 13:04
余来
Rank: 6Rank: 6
等 级:贵宾
威 望:26
帖 子:956
专家分:18
注 册:2006-8-13
收藏
得分:0 

应该不会有吧,有的话,估计为微软也没公开。
我这里只找到一个获取CPU状态的,要获取系统状态的话,估计需要0级别的权限。估计很难哦

//获取CPU状态的代码

#define SystemBasicInformation 0
#define SystemPerformanceInformation 2
#define SystemTimeInformation 3

#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))

typedef struct
{
DWORD dwUnknown1;
ULONG uKeMaximumIncrement;
ULONG uPageSize;
ULONG uMmNumberOfPhysicalPages;
ULONG uMmLowestPhysicalPage;
ULONG uMmHighestPhysicalPage;
ULONG uAllocationGranularity;
PVOID pLowestUserAddress;
PVOID pMmHighestUserAddress;
ULONG uKeActiveProcessors;
BYTE bKeNumberProcessors;
BYTE bUnknown2;
WORD wUnknown3;
} SYSTEM_BASIC_INFORMATION;

typedef struct
{
LARGE_INTEGER liIdleTime;
DWORD dwSpare[76];
} SYSTEM_PERFORMANCE_INFORMATION;

typedef struct
{
LARGE_INTEGER liKeBootTime;
LARGE_INTEGER liKeSystemTime;
LARGE_INTEGER liExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION;

typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);

PROCNTQSI NtQuerySystemInformation;

CpuUsage(long *plResult)
{
SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;
SYSTEM_TIME_INFORMATION SysTimeInfo;
SYSTEM_BASIC_INFORMATION SysBaseInfo;
double dbIdleTime;
double dbSystemTime;
LONG status;
static LARGE_INTEGER liOldIdleTime = {0,0};
static LARGE_INTEGER liOldSystemTime = {0,0};

NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(
GetModuleHandle("ntdll",
"NtQuerySystemInformation"
);

if (!NtQuerySystemInformation)
return S_FALSE;

// 得到系统中处理器数
status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
if (status != NO_ERROR)
return S_FALSE;

// 得到新的系统时间
status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);
if (status!=NO_ERROR)
return S_FALSE;

// 得到新的CPU空闲时间
status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
if (status != NO_ERROR)
return S_FALSE;

// 如果第一次调用跳过
if (liOldIdleTime.QuadPart != 0)
{
// 当前值 = 最新值 - 旧值
dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);

// 当前CPU空闲时间 = 空闲时间 / 系统时间
dbIdleTime = dbIdleTime / dbSystemTime;

// 当前CPU利用率% = 100 - (当前CPU空闲时间 * 100) / 处理器数
dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors + 0.5;

*plResult = (UINT)dbIdleTime;
}

// 存储新的CPU空闲及系统时间
liOldIdleTime = SysPerfInfo.liIdleTime;
liOldSystemTime = SysTimeInfo.liKeSystemTime;

return S_OK;
}


2007-06-07 13:39
kutbie
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-3-27
收藏
得分:0 

谢谢!
看来确实很困难啊~

2007-06-07 13:46
快速回复:[求助]如何获得当前Windows系统的状态(正常运行还是正在关机)?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016587 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved