获取系统信息源码

//====================================================================================
 //转载请注明如下内容!!!
 //编程人员:Jason's.Alex
 //日期:2010/11/01
 //QQ:531401335
 //邮箱:531401335@qq.com
 //blog:blog.sina.com.cn/jasonsalex
 //官方:bctalk.5d6d.com
 //技术官方QQ群:3855916<ΛV(Lambda Visual)For QT >(欢迎各个领域的QT开发人员加入)
 //编译平台:BCB2009 for xp
 //说明:此源码用于获取系统相关的消息...仅供广大编程人员交流,学习之用
 //心得:我把以前开发的软件所用到的API函数封装了起来,这样我使用简便,不断的重复使用,这好像就是C++核心思想吧,我可以不断的扩充,让他更健壮起来..就当做给社区做一点点贡献吧..呵呵!.哦,当然..如果你有好的意见可以和我联系.
//=====================================================================================
#ifndef SystemH
#define SystemH
#include <Classes.hpp>
#include <Registry.hpp>
#include <Dialogs.hpp>
#include <tlhelp32.h>
#include <vector>
//==============================================================================
namespace System
{
 class TokenPrivilege    //令牌权限
 {
  public:
    TokenPrivilege(const DWORD &DesiredAccess=TOKEN_ADJUST_PRIVILEGES,
    LPCTSTR PrivilegeValue=SE_DEBUG_NAME,
    const DWORD &Attributes=SE_PRIVILEGE_ENABLED,const HANDLE &Handle=GetCurrentProcess());
 };
}

//==============================================================================
namespace System
{

 class Power:public TokenPrivilege //系统电源类
 {
 public:
  enum PowerKind{ShutDown=0,Reboot,Pause,Dormant,LogOff,Display};//电源状态
  bool SetPower(PowerKind Kind)const;//执行关机函数
  Power(void);
 };
}
//===============================================================================

namespace System
{
 class NetCard      //设置网卡网关
 {
  public:
   NetCard();
   ~NetCard();
   bool SetGateway(String Gateway);//设置网关
   bool NetCardInfo();//获取网关信息
   const String& GetDeviceID();  //获取设备ID
   const String& GetDescripitonName();//获取描述名
   const String& GetIPAddress();//获取IP地址
   const String& GetSubMask();//获取子掩码
   const String& GetGateway();//获取网关地址
  private:
   bool NotifyGatewayChange(const String &IPAddr,const String &SubMask,const String &Gateway)const;//通知网关更改事件
   TRegistry *Reg;
   String DeviceID,DescriptionName;   //设备ID//设备描述名
   char  IPAddr[256],SubMask[256],Gateway[256]; //Ip地址..子掩码 ,网关
 };
}
//================================================================================

namespace System
{
 using std::vector;
 class Process:public TokenPrivilege //系统进程管理
 {

  public:
   Process(TStringList *pProcess);
   bool ProcessFirst(HANDLE Snapshot,LPPROCESSENTRY32 PPE)const;//枚举进程
   inline  bool ProcessNext(HANDLE Snapshot,LPPROCESSENTRY32 PPE)const;
   DWORD ProcessFind(const WideString &ExeName)const;// 查找进程
   void BanProcess(const bool &Enable);//禁止进程
   HANDLE GetProcessHandle(const int &Id)const;//获取进程句柄
  private:
    vector<String> ProcessList;

 };
}
//-----------------------------------------------------------------------------

//==============================================================================
  HOOKPROC JournalLogProc(int iCode,WPARAM wParam, LPARAM lParam);//日子钩子回调函数
namespace System
{


 class Hook       //系统hook
 {
  public:
    Hook(int HookId);
    ~Hook();
  static bool GetSystemIdle(void);
  static bool SystemIdle;   //查看系统是否空闲
  static  HHOOK HookHandle; //钩子句柄
 };
}

//==============================================================================
namespace System
{
 class Hardware
 {
  public:
   Hardware(void);
   int GetCPUUsage(void);//获取CPU使用率
   int GetCPUIdle(void);//获取CPU空闲率
   int GetCPUNum(void)const;//获取CPU数量

  private:
   inline void ExecuteFileTime(void);//执行时间片
   inline int CompareFileTime(const _FILETIME *PreTime,const _FILETIME *CurrentTime)const;//比较两个时间片
    _FILETIME Idle,Kernel,User;
   _FILETIME PreIdle,PreKernel,PreUser;
   int IdleTime,KernelTime,UserTime;
    };
}
#endif

 

 

//====================================================================================
 //转载请注明如下内容!!!
 //编程人员:Jason's.Alex
 //日期:2010/11/01
 //QQ:531401335
 //邮箱:531401335@qq.com
 //blog:blog.sina.com.cn/jasonsalex
 //官方:bctalk.5d6d.com
 //技术官方QQ群:3855916<ΛV(Lambda Visual)For QT >(欢迎各个领域的QT开发人员加入)
 //编译平台:BCB2009 for xp
 //说明:此源码用于获取系统相关的消息...仅供广大编程人员交流,学习之用
 //心得:我把以前开发的软件所用到的API函数封装了起来,这样我使用简便,不断的重复使用,这好像就是C++核心思想吧,我可以不断的扩充,让他更健壮起来..就当做给社区做一点点贡献吧..呵呵!.哦,当然..如果你有好的意见可以和我联系.
//=====================================================================================
#pragma hdrstop

#include "System.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
TokenPrivilege::TokenPrivilege(const DWORD &DesiredAccess,LPCTSTR PrivilegeValue,
        const DWORD &Attributes,const HANDLE &Handle)
{
    HANDLE Token;
 TOKEN_PRIVILEGES TP;

 if(!OpenProcessToken(Handle,DesiredAccess,&Token))   //打开进程令牌
     throw Exception("访问令牌权限失败!");
 LookupPrivilegeValue(NULL,PrivilegeValue,&TP.Privileges[0].Luid);
 TP.PrivilegeCount=1;
 TP.Privileges[0].Attributes=Attributes;

 if(!AdjustTokenPrivileges(Token,false,&TP,sizeof(TP),NULL,0))     //将当前程序启用特权
   throw Exception("修改令牌权限失败");

 CloseHandle(Token);
}
//=============================================================================
Power::Power():TokenPrivilege(TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,SE_SHUTDOWN_NAME,SE_PRIVILEGE_ENABLED)
{
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
bool Power::SetPower(PowerKind Kind)const //执行关机函数
{

  switch(Kind)
  {
  case PowerKind::ShutDown:
  if(!ExitWindowsEx(EWX_FORCE|EWX_SHUTDOWN,0)) //关机
  {
  return false;
  }
  break;

   case Reboot:
   if(!ExitWindowsEx(EWX_FORCE|EWX_REBOOT,0))  //重启
   {
   return false;
   }
   break;

   case Pause:
   if(!SetSystemPowerState(true,true))//待机
     {
     return false;
     }
     break;

   case Dormant:
   if(!SetSystemPowerState(false,true))//休眠
   {
   return false;
   }
   break;

   case LogOff:
   if(!ExitWindowsEx(EWX_LOGOFF|EWX_FORCE,0))//注销
   {
   return false;
   }
   break;

   case Display:
   SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);//关闭显示器
   break;

   default:
   return false;
     }

  return true;
}

//==============================================================================
  //设置网卡IP地址,网关类
//===============================================================================
 NetCard::NetCard()
 {
 Reg=new TRegistry;    //设置注册表键值
 Reg->RootKey=HKEY_LOCAL_MACHINE;
 if(!this->NetCardInfo())      //捕获异常信息
 {
  throw Exception("获取网卡信息失败!");
    }
 }
 //----------------------------------------------------------------------------
 NetCard::~NetCard()
 {
 delete Reg;
 }
 //------------------------------------------------------------------------------
 bool NetCard::NetCardInfo()//获取网关信息
 {
 TStringList *Keys=new TStringList;
 DWORD DateType,BufSize=256;

 Reg->OpenKey("//SOFTWARE//Microsoft//Windows NT//CurrentVersion//NetworkCards",false);
 Reg->GetKeyNames(Keys);//获取所有网卡设备
 Reg->CloseKey();

 for(int i=0;i<Keys->Count;++i)
 {
  Reg->OpenKey("//SOFTWARE//Microsoft//Windows NT//CurrentVersion//NetworkCards//"+Keys[0][i],false);
  DescriptionName=Reg->ReadString("Description");    //获取设备描述名字
  DeviceID=Reg->ReadString("ServiceName");//获取设备ID
  Reg->CloseKey();
  if(!DescriptionName.IsEmpty())//判断是否是网卡
  {
   Reg->OpenKey("//SYSTEM//CurrentControlSet//Services//Tcpip//Parameters//Interfaces//"+DeviceID,false);//打开当前设备配置

   if(RegSetValueEx(Reg->CurrentKey,"DefaultGateway",0,REG_MULTI_SZ,Gateway,sizeof(Gateway))!=0)//设置网关地址
    return false;

   if(RegQueryValueEx(Reg->CurrentKey,"IPAddress",0,&DateType,IPAddr,&BufSize)!=0)   //获取IP地址
    return false;

    BufSize=256;
   if(RegQueryValueEx(Reg->CurrentKey,"SubnetMask",0,&DateType,SubMask,&BufSize)!=0)  //获取子掩码
    return false;

   Reg->CloseKey();
   break;
  }

 }
 delete Keys;
 return true;
 }
 //-----------------------------------------------------------------------------
 const String& NetCard::GetDeviceID()  //获取设备ID
 {
  return DeviceID;
 }
 //-----------------------------------------------------------------------------
 const String& NetCard::GetDescripitonName()//获取描述名
 {
  return DescriptionName;
 }
 //-----------------------------------------------------------------------------
 const String& NetCard::GetIPAddress()//获取IP地址
 {
  return IPAddr;
 }
 //-----------------------------------------------------------------------------
 const String& NetCard::GetSubMask()//获取子掩码
 {
 return SubMask;
 }
 //-----------------------------------------------------------------------------
 const String& NetCard::GetGateway()//获取网关地址
 {
  return Gateway;
 }
 //----------------------------------------------------------------------------
bool NetCard::SetGateway(String Gateway)//设置网关
 {
 return  NotifyGatewayChange(IPAddr,SubMask,Gateway);
}
 //--------------------------------------------------------------------------------
bool NetCard::NotifyGatewayChange(const String &IPAddr,const String &SubMask,const String &Gateway)const//通知网关更改事件
{
 String Parameter("interface ip set address /"本地连接/" static");
 Parameter+=" "+IPAddr+" "+SubMask+" "+Gateway+" "+"1";
 return ShellExecute(NULL,"open","netsh",Parameter.t_str(),NULL,SW_HIDE);
}
//===============================================================================
      //系统进程管理
//===============================================================================

Process::Process(TStringList *pProcess):
    TokenPrivilege(TOKEN_ADJUST_PRIVILEGES,SE_DEBUG_NAME,SE_PRIVILEGE_ENABLED)
{
 for(int i=0;i<pProcess->Count;++i)
  ProcessList.push_back(pProcess[0][i]);

}

//------------------------------------------------------------------------------
bool Process::ProcessFirst(HANDLE Snapshot,PPROCESSENTRY32 PPE)const//枚举进程
{
   bool OK=Process32First(Snapshot,PPE);
   if(OK&&(PPE->th32ProcessID==0))
  OK=ProcessNext(Snapshot,PPE);
   return OK;
}
//------------------------------------------------------------------------------
bool Process::ProcessNext(HANDLE Snapshot,PPROCESSENTRY32 PPE)const
{
 bool OK=Process32Next(Snapshot,PPE);
   if(OK&&(PPE->th32ProcessID==0))
  OK=ProcessNext(Snapshot,PPE);
 return OK;
}
//------------------------------------------------------------------------------
DWORD Process::ProcessFind(const WideString &ExeName)const// 查找进程
{
  PROCESSENTRY32 PPE={sizeof(PPE)};
  HANDLE Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  if(Snapshot==INVALID_HANDLE_VALUE)
       return 0;
   for(bool Ok=ProcessFirst(Snapshot,&PPE);Ok;Ok=ProcessNext(Snapshot,&PPE))
   {
    if(ExeName.LowerCase()==WideString(PPE.szExeFile).LowerCase())
    {
       CloseHandle(Snapshot);
       return PPE.th32ProcessID;  //返回进程ID
    }

   }
   CloseHandle(Snapshot);
    return 0;
}
//-------------------------------------------------------------------------------
HANDLE Process::GetProcessHandle(const int &Id)const//获取进程句柄
{
 return OpenProcess(PROCESS_TERMINATE,false,Id);//获取进程句柄
}
//--------------------------------------------------------------------------------
void Process::BanProcess(const bool &Enable)//禁止进程
{
 DWORD WndId=0;
 while(Enable)
 {
  for(vector<int>::size_type i=0;i<ProcessList.size();++i)
  {
   if(WndId=ProcessFind(ProcessList[i]))
    {
      HANDLE hwnd=GetProcessHandle(WndId);
     if(hwnd)
     {
      TerminateProcess(hwnd,0);
      CloseHandle(hwnd);
     }
    }
  }
  Application->ProcessMessages();
    Sleep(10);
 }
}

//==============================================================================
  //系统hook
//==============================================================================
bool Hook::SystemIdle=false;
HHOOK Hook::HookHandle=NULL;
//------------------------------------------------------------------------------
Hook::Hook(int HookId)
{
               switch(HookId)
               {
      case WH_JOURNALRECORD:
       {
         HookHandle=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalLogProc,HInstance,0);
                                 break;
                            }

               }

               if(HookHandle==NULL) //是否成功启用hook.否则引发异常
     throw Exception("使用hook失败");
}
//------------------------------------------------------------------------------
 bool Hook::GetSystemIdle(void)
{
  bool TempIdle=SystemIdle;
  SystemIdle=true;//设置为空闲状态

  return TempIdle;
}
//------------------------------------------------------------------------------
Hook::~Hook()
{
  if(HookHandle!=NULL)      //卸载钩子
   UnhookWindowsHookEx(HookHandle);
}
//-------------------------------------------------------------------------------
HOOKPROC JournalLogProc(int iCode,WPARAM wParam, LPARAM lParam)//日子钩子回调函数
{
 if(iCode<0)
  return  (HOOKPROC)CallNextHookEx(Hook::HookHandle,iCode,wParam,lParam);

 if(iCode==HC_ACTION)
 {
    EVENTMSG *MSG=(EVENTMSG*)lParam;
    if(MSG->message==WM_KEYDOWN||MSG->message==WM_MOUSEMOVE)
    {
   Hook::SystemIdle=false;//使用中
    }
 }
 return  (HOOKPROC)CallNextHookEx(Hook::HookHandle,iCode,wParam,lParam);
}
//---------------------------------------------------------------------------------

//==============================================================================
  //获取CPU使用量
Hardware::Hardware()
{
 GetSystemTimes(&PreIdle,&PreKernel,&PreUser);
}
//------------------------------------------------------------------------------
int Hardware::GetCPUUsage(void)
{
  this->ExecuteFileTime();
  return (KernelTime+UserTime-IdleTime)*100/(KernelTime+UserTime);//计算CPU使用量
}
//------------------------------------------------------------------------------
int Hardware::GetCPUIdle(void)//获取CPU空闲率
{
    this->ExecuteFileTime();
    return IdleTime*100/(KernelTime+UserTime);
}
//------------------------------------------------------------------------------
int Hardware::GetCPUNum(void)const//获取CPU数量
{
 _SYSTEM_INFO CPU;
 GetSystemInfo(&CPU);
 return CPU.dwNumberOfProcessors;
}
//------------------------------------------------------------------------------
int Hardware::CompareFileTime(const _FILETIME *PreTime,const _FILETIME *CurrentTime)const//比较两个时间片
{
  int Pre=PreTime->dwHighDateTime<<32|PreTime->dwLowDateTime;//获取先前的时间片
  int Cur=CurrentTime->dwHighDateTime<<32|CurrentTime->dwLowDateTime; //获取当前的时间片
  return (Cur-Pre);
}
//-------------------------------------------------------------------------------
void Hardware::ExecuteFileTime(void)//执行时间片
{
  Application->ProcessMessages();
  Sleep(1000);
  GetSystemTimes(&Idle,&Kernel,&User);
             //比较时间片
  IdleTime=CompareFileTime(&PreIdle,&Idle);
  KernelTime=CompareFileTime(&PreKernel,&Kernel);
  UserTime=CompareFileTime(&PreUser,&User);

  PreIdle=Idle;//交换时间片
  PreKernel=Kernel;
  PreUser=User;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值