用C#防止屏幕睡眠

时间:2018-03-01 08:41:11

标签: c# .net windows user-input

我创建了一个小型的C#控制台应用程序,用于在屏幕上移动指针,希望这可以防止屏幕在几分钟后进入休眠/锁定状态。不幸的是,几分钟后屏幕仍然会进入睡眠状态。

有没有人知道它是否真的可以在C#中写一些像用户输入(鼠标或键盘)的东西,并防止屏幕自动睡眠/锁定?

这就是我所拥有的,我认为可以做到这一点。

procedure TfmMain.CreateDocument0;
var
  TempleateFileName: string;
  WordApp, Document: OleVariant;

  procedure FillBookmark(BookmarkName, bText: string);
  var
    Range: OleVariant;
  begin
    if Document.Bookmarks.Exists(BookmarkName) then
    begin
      Range := Document.Bookmarks.Item(BookmarkName).Range;
      Range.Text := bText;
    end;
  end;
begin
  TempleateFileName := ExtractFilePath(Application.ExeName)+'Templates\0.dot';
  try
    WordApp := GetActiveOleObject('Word.Application');
  except
    try
      WordApp := CreateOleObject('Word.Application');
    except
      on E: Exception do
      begin
        MessageBox(Self.Handle, PChar(E.Message), PChar(fmMain.Caption), MB_OK+MB_ICONERROR);
        Exit;
      end;
    end;
  end;

  try
    Document := WordApp.Documents.Add(TempleateFileName, False);

    FillBookmark('ObjectType', edt0ObjectType.Text);
    ...

    WordApp.Visible := True;
    WordApp.Activate;
  finally
    WordApp := Unassigned;
  end;
end;

1 个答案:

答案 0 :(得分:6)

您可以使用SetThreadExecutionState

  

使应用程序能够通知系统它正在使用中   防止系统进入睡眠状态或关闭显示屏   应用程序正在运行。

<强>说明

  

在没有SetThreadExecutionState的情况下调用ES_CONTINUOUS只会重置   空闲计时器;保持显示器或系统处于工作状态,   线程必须定期调用SetThreadExecutionState

     

要在电源管理的计算机上正常运行,请使用传真等应用程序   服务器,应答机,备份代理和网络管理   应用程序必须同时使用ES_SYSTEM_REQUIREDES_CONTINUOUS   他们处理事件。多媒体应用程序,例如视频播放器   和演示文稿应用程序,必须使用ES_DISPLAY_REQUIRED   在没有用户输入的情况下长时间显示视频。   应用程序,如文字处理程序,电子表格,浏览器和   游戏不需要拨打SetThreadExecutionState

<强>的DllImport

[DllImport("kernel32.dll", CharSet = CharSet.Auto,SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);

<强>枚举

[FlagsAttribute]
public enum EXECUTION_STATE :uint
{
     ES_AWAYMODE_REQUIRED = 0x00000040,
     ES_CONTINUOUS = 0x80000000,
     ES_DISPLAY_REQUIRED = 0x00000002,
     ES_SYSTEM_REQUIRED = 0x00000001
     // Legacy flag, should not be used.
     // ES_USER_PRESENT = 0x00000004
}

<强>用法

void PreventSleep ()
{
    // Prevent Idle-to-Sleep (monitor not affected) (see note above)
    SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED);
}