Delphi 操作Windows系统睡眠-防止系统/电脑 进入睡眠或关闭显示器

Delphi 操作Windows系统睡眠-防止系统/电脑 进入睡眠或关闭显示器

1、防止进入睡眠

1.1、引用单元

Delphi 单元:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

unit SystemCriticalU;

interface

uses

  Windows;

type

  TSystemCritical =class

  private

    FIsCritical:Boolean;

    procedure SetIsCritical(const Value:Boolean) ;

  protected

    procedure UpdateCritical(Value:Boolean) ; virtual;

  public

    constructor Create;

    property IsCritical:Boolean read FIsCriticalwrite SetIsCritical;

  end;

var

  SystemCritical: TSystemCritical;

implementation

{ TSystemCritical }

// REF: http://msdn.microsoft.com/en-us/library/aa373208.aspx

type

  EXECUTION_STATE = DWORD;

   

const

  ES_SYSTEM_REQUIRED =$00000001;

  ES_DISPLAY_REQUIRED =$00000002;

  ES_USER_PRESENT =$00000004;

  ES_AWAYMODE_REQUIRED =$00000040;

  ES_CONTINUOUS =$80000000;

   

  KernelDLL ='kernel32.dll';

{

  SetThreadExecutionState Function

  Enables an application to inform the system that it is in use,

  thereby preventing the system from entering sleep or turning off the

  display while the application is running.

}

procedure SetThreadExecutionState(ESFlags: EXECUTION_STATE);

  stdcall; external kernel32 name'SetThreadExecutionState';

constructor TSystemCritical.Create;

begin

  inherited;

  FIsCritical :=False;

end;

procedure TSystemCritical.SetIsCritical(const Value:Boolean) ;

begin

  if FIsCritical = Valuethen

    Exit;

  FIsCritical := Value;

  UpdateCritical(FIsCritical);

end;

procedure TSystemCritical.UpdateCritical(Value:Boolean) ;

begin

  if Valuethen

    // 防止睡眠空闲超时和关机。

    SetThreadExecutionState(ES_SYSTEM_REQUIREDor ES_CONTINUOUS)

  else

    //清除执行状态标志以禁用离开模式并允许

    // 系统空闲以正常睡眠

    SetThreadExecutionState(ES_CONTINUOUS);

end;

initialization

SystemCritical := TSystemCritical.Create;

finalization

SystemCritical.IsCritical :=False;

SystemCritical.Free;

end. 

引用示例:

1

2

3

4

5

6

7

SystemCritical.IsCritical =true;

try

  // 这里做关键操作

  // 不会进入睡眠和关闭显示器

finally

  SystemCritical.IsCritical =false;

end;

1.2 直接使用WinAPI函数,点击查看:SetThreadExecutionState 

 

2、使电脑进入睡眠

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//提升进程令牌函数

function AdjustProcessPrivilege(ProcessHandle: THandle; Token_Name:Pchar):boolean;

var

  Token: THandle;

  TokenPri: _TOKEN_PRIVILEGES;

  ProcessDest:int64;

  l: DWORD;

begin

  Result :=False;

  if OpenProcessToken(ProcessHandle, TOKEN_Adjust_Privileges, Token)then

  begin

    if LookupPrivilegeValue(nil, Token_Name, ProcessDest)then

    begin

      TokenPri.PrivilegeCount :=1;

      TokenPri.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

      TokenPri.Privileges[0].Luid := ProcessDest;

      l :=0;

      //更新进程令牌,成功返回TRUE

      if AdjustTokenPrivileges(Token,False, TokenPri, sizeof(TokenPri),nil, l)then

        Result :=True;

    end;

  end;

end;  

引用示例:

1

2

3

4

5

6

if AdjustProcessPrivilege(GetCurrentProcess,'SeShutdownPrivilege')then//提升权限

begin

  SetSystemPowerState(false,TRUE);//进入睡眠

end else begin

  //

end;

  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于Delphi的网络远程唤醒代码,网络上的代码错误很多,这是修改好的可执行源代码,经过测试,能正常唤醒支持网络唤醒的计算机。该代码非常实用。 procedure WakeUp(SAddr: string); var WSAData: TWSAData; MSocket: TSocket; SockAddrIn: TSockAddrIn; RetVal, OptVal, i: Integer; MacAddr: array[0..5] of Byte; MagicData: array[0..101] of Byte; Position: Longint; begin try if Length(SAddr) 17 then Abort; for i := 1 to Length(SAddr) do if i in [3, 6, 9, 12, 15] then if SAddr[i] '-' then Abort; for i := 0 to High(MacAddr) do begin if Pos('-', SAddr) > 0 then MacAddr[i] := StrToInt(HexDisplayPrefix + Copy(SAddr, 1, Pos('-', SAddr) - 1)) else MacAddr[i] := StrToInt(HexDisplayPrefix + SAddr); //Delete 是删除一个 字符串中的 某部分字符 //Delete(str, index, count) // str, //被删除的字符串 // index, //从第几个字符开始删除 // count //删除几个 //Delete(S, 2, 2); 就是从S中的第二个开始删除,删除2个字符即2、3. //Pos(a,b); 取出子串a,在父串b中第一次出现的位置; //Pos'b','abcd'); 返回结果是:2 Delete(SAddr, 1, Pos('-', SAddr)); end; except //application.MessageBox('网卡地址错误','警告',MB_ICONWARING); 错误:MB_ICONWARING application.MessageBox('网卡地址错误', '警告', MB_ICONWARNING); exit; end; try CheckWinSockResult(WSAStartup($0101, WSAData), 'WSAStartup'); MSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if MSocket = INVALID_SOCKET then CheckWinSockResult(MSocket, 'socket'); OptVal := 1; CheckWinSockResult(setsockopt(MSocket, SOL_SOCKET, SO_BROADCAST, PChar(@OptVal), SizeOf(OptVal)), 'setsockopt'); FillChar(MagicData, SizeOf(MagicData), $FF); Position := LEN_PHYSADDR; while Position < SizeOf(MagicData) do begin Move(MacAddr, Pointer(Longint(@MagicData) + Position)^, LEN_PHYSADDR); Inc(Position, LEN_PHYSADDR); end; SockAddrIn.sin_family := AF_INET; SockAddrIn.sin_addr.S_addr := Longint(INADDR_BROADCAST); RetVal := sendto(MSocket, MagicData, SizeOf(MagicData), 0, SockAddrIn, SizeOf(SockAddrIn)); if RetVal = SOCKET_ERROR then CheckWinSockResult(RetVal, 'sendto'); CheckWinSockResult(closesocket(MSocket), 'closesocket'); CheckWinSockResult(WSACleanup, 'WSACleanup'); except exit; end; end;

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蝈蝈(GuoGuo)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值