用VC++实现Win2000/XP下的休眠

转载 2004年09月26日 14:42:00
用VC++实现Win2000/XP下的休眠
 

 

[摘自:太平洋电脑网]
 实现休眠功能很简单,只要在任意想要执行的地方执行如下给出的休眠函数SetPower()就行,其实休眠很简单,只需要API:SetSystemPowerState()ï就行,就如关机/注销/重启一样,只需要ExitWindowEx(),但这些API可以直接用在98下,却不能用在2000/XP中,因为这里牵涉到了用户权限,没有权限是不能进行这些操作的,所以,首先要取得权限,下面给出代码:

  #define RTN_ERROR 13


  void PERR(LPTSTR szAPI, DWORD dwLastError) //休眠时调用到的一个函数,用来

  ////记录休眠中遇到的错误

  {

  LPTSTR MessageBuffer;

  DWORD dwBufferLength;

  fprintf(stderr,"%s error! (rc=%lu)/n", szAPI, dwLastError);

  if(dwBufferLength=FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |

  FORMAT_MESSAGE_FROM_SYSTEM,

  NULL,

  dwLastError,

  LANG_NEUTRAL,

  (LPTSTR) &MessageBuffer,

  0,

  NULL))

  {

  DWORD dwBytesWritten;

  WriteFile(GetStdHandle(STD_ERROR_HANDLE),

  MessageBuffer,

  dwBufferLength,

  &dwBytesWritten,

  NULL);

  LocalFree(MessageBuffer);

  }

  }

  INT SetPower()有//主要功能函数

  {

  TOKEN_PRIVILEGES tp;

  HANDLE hToken;

  LUID luid;

  LPTSTR MachineName=NULL;

  if(!OpenProcessToken(GetCurrentProcess(), ////////从这里////////////////////////////

  TOKEN_ADJUST_PRIVILEGES,

  &hToken ))

  {

  PERR("OpenProcessToken", GetLastError() );

  return RTN_ERROR;

  }

  if(!LookupPrivilegeValue(MachineName, SE_SHUTDOWN_NAME, &luid))

  {

  PERR("LookupPrivilegeValue", GetLastError() );

  return RTN_ERROR;

  }

  tp.PrivilegeCount = 1;

  tp.Privileges[0].Luid = luid;

  tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),

  NULL, NULL ); ////////////////到这里,是取得权限//////////////////////

  SetSystemPowerState(FALSE,TRUE);

  return 0;

  }

  这样,在任意需要休眠的时候调用SetPower();即可休眠,但是有一点要注意:必须打开了高级电源管理的休眠支持。

让你的win2000能运行98的程序如同xp兼容模式

有时我们在win2000安装一些小软件不能正常运行,可以试试让两千模拟win98的兼容环境来运行该程序。在sp4下的windows2000直截在运行注册regsvr32 c:/winnt/apppat...
  • wsp1
  • wsp1
  • 2005年03月17日 16:59
  • 2777

用VC++实现Windows 2000/XP下的休眠

 实现休眠功能很简单,只要在任意想要执行的地方执行如下给出的休眠函数SetPower()就行,其实休眠很简单,只需要API:SetSystemPowerState()就行,就如关机/注销/重启一样,只...
  • Y___Y
  • Y___Y
  • 2006年09月10日 13:13
  • 858

Win2000/WinXP/Win2003双系统启动

Win98SE/WinME和Win2000/WinXP/Win2003双系统启动        首先简要分析(深入讨论请参阅此帖)因重装Win98SE/WinME导致双启动故障的原因: 那是因为你格式...
  • debren
  • debren
  • 2005年03月05日 16:06
  • 3191

Windows 98/2000/XP/2003访问XP的用户验证问题

Windows 98/2000/XP/2003访问XP的用户验证问题首先关于启用Guest为什么不能访问的问题:1、默认情况下,XP 禁用Guest帐户2、默认情况下,XP的本地安全策略禁止Guest...
  • yx10
  • yx10
  • 2004年10月08日 08:28
  • 3103

Windows 2000/XP下的休眠 VC++实现

首先要取得权限,下面给出代码:  #define RTN_ERROR 13  void PERR(LPTSTR szAPI, DWORD dwLastError) //休眠时调用到的一个函数,用来  ...
  • bluewind23
  • bluewind23
  • 2009年07月28日 10:44
  • 360

系统大玩家Ghost 2000 Pro SP4/2K 装机版光盘 By:深度空间

图片: screen.width-461) window.open(http://bbs.povop.com/attachment/Mon_0712/2_4308_c24cee65c538421.jp...
  • bao1213
  • bao1213
  • 2007年12月03日 18:10
  • 4426

Windows 2000/XP下如何实现红外手机上网?

        手机上网是许多笔记本用户移动上网的通常方案,而通过红外上网则是最常用的方法了。近年来生产的手机基本上都具备了内置MODEM的功能,用户只需到当地电信营业厅开通数据业务(有的地方是开户时...
  • hzbairly
  • hzbairly
  • 2006年10月12日 11:36
  • 462

VC++实现Win2000下直接读写磁盘扇区

【导读】本文主要介绍了在Windows 2000下对磁盘扇区数据的直接读写访问方法,并在此基础上实现了对磁盘扇区内容的查看、基于扇区的数据备份与恢复、对磁盘信息的彻底擦除等一些有着实际意义的应用。引言...
  • daichanglin
  • daichanglin
  • 2006年11月20日 21:22
  • 751

VC++实现Win2000下直接读写磁盘扇区

转自:http://blog.csdn.net/leecylove/archive/2004/12/08/208830.aspx引言   由于Windows 操作系统在很大程度上采取了访问安全保...
  • cosmoslx
  • cosmoslx
  • 2010年07月28日 12:49
  • 348

VC++实现Win2000下直接读写磁盘扇区

摘要:本文主要介绍了在Windows 2000下对磁盘扇区数据的直接读写访问方法,并在此基础上实现了对磁盘扇区内容的查看、基于扇区的数据备份与恢复、对磁盘信息的彻底擦除等一些有着实际意义的应用。  关...
  • ZF78
  • ZF78
  • 2008年05月12日 21:31
  • 844
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用VC++实现Win2000/XP下的休眠
举报原因:
原因补充:

(最多只允许输入30个字)