Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式停止屏幕保护程序_C#_Smartcard_Screensaver_Smartcard Reader - Fatal编程技术网

C# 以编程方式停止屏幕保护程序

C# 以编程方式停止屏幕保护程序,c#,smartcard,screensaver,smartcard-reader,C#,Smartcard,Screensaver,Smartcard Reader,如何在屏幕保护程序运行时停止它?无需移动鼠标或按键盘上的键。我的应用程序输入来自读卡器,如果屏幕保护程序正在运行,我的应用程序仍然工作正常,但当读卡器收到输入时,屏幕保护程序不会停止 我试过了,似乎对我不起作用 我试着在这个线程上假装鼠标移动,正如线程中提到的,它在Windows8上似乎不起作用(我在Windows8.1上运行) 我甚至尝试了SendKeys 我看到的大多数其他问题/示例都是关于停止启动屏幕保护程序的,这是我不想要的。如果读卡器中有输入,我希望屏幕保护程序启动和停止。使用此win

如何在屏幕保护程序运行时停止它?无需移动鼠标或按键盘上的键。我的应用程序输入来自读卡器,如果屏幕保护程序正在运行,我的应用程序仍然工作正常,但当读卡器收到输入时,屏幕保护程序不会停止

我试过了,似乎对我不起作用

我试着在这个线程上假装鼠标移动,正如线程中提到的,它在Windows8上似乎不起作用(我在Windows8.1上运行)

我甚至尝试了
SendKeys

我看到的大多数其他问题/示例都是关于停止启动屏幕保护程序的,这是我不想要的。如果读卡器中有输入,我希望屏幕保护程序启动和停止。

使用此winAPI告诉操作系统线程正在使用,即使用户没有与计算机交互。这将防止屏幕保护程序出现,并阻止机器自动暂停

使应用程序能够通知系统它正在使用,从而防止系统在应用程序运行时进入睡眠状态或关闭显示器

有一系列标志可指定当前线程的新状态:

[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
 }
//To stop screen saver and monitor power off event
//You can combine several flags and specify multiple behaviors with a single call
SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);

//To reset or allow those event again you have to call this API with only ES_CONTINUOUS
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);//This will reset as normal
  • ES_AWAYMODE_REQUIRED(0x00000040):启用离开模式
  • ES_DISPLAY_REQUIRED(0x00000002):通过重置显示空闲计时器,强制打开显示
  • ES_SYSTEM_REQUIRED(0x00000001):通过重置系统空闲计时器,强制系统处于工作状态
  • ES_CONTINUOUS(0x8000000):通知系统正在设置的状态应保持有效,直到下一个使用ES_CONTINUOUS的调用和其他状态标志之一被清除
因为这是一个winAPI,所以您必须这样做:

[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
 }
//To stop screen saver and monitor power off event
//You can combine several flags and specify multiple behaviors with a single call
SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);

//To reset or allow those event again you have to call this API with only ES_CONTINUOUS
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);//This will reset as normal
用户定义的类型:

[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
 }
//To stop screen saver and monitor power off event
//You can combine several flags and specify multiple behaviors with a single call
SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);

//To reset or allow those event again you have to call this API with only ES_CONTINUOUS
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);//This will reset as normal
下面是调用过程:

[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
 }
//To stop screen saver and monitor power off event
//You can combine several flags and specify multiple behaviors with a single call
SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_SYSTEM_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);

//To reset or allow those event again you have to call this API with only ES_CONTINUOUS
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);//This will reset as normal
根据这个API,使用起来是安全的

系统维护调用SetThreadExecutionState的应用程序计数。系统跟踪调用SetThreadExecutionState的每个线程,并相应地调整计数器。如果此计数器达到零且没有任何用户输入,则系统进入睡眠状态


如果应用程序在重置标志之前崩溃,系统将进行调整并自动重置。

您是否编写了屏幕保护程序?@ManoDestra您的意思是什么?这只是windows上“个性化”菜单下的一个普通屏幕保护程序。我想你是说“不”。在这种情况下,您可能很难做到这一点。如果您自己编写屏幕保护程序,操作会简单得多。在智能卡读卡器输入上,您可以像这样更改注册表值-调用registry.SetValue(“HKEY_CURRENT_USER\Control Panel\Desktop”、“Screensave active”、“1”),这在windows 7上有效。不太清楚Windows 8。@Sanket这是怎么回事?我检查了这个值,现在已经是1了。非常清楚的答案值得更多的投票。我知道最初的问题是关于防止屏幕保护程序,但我将证明
SetThreadExecutionState
对于在没有鼠标或键盘活动时防止锁定屏幕是绝对有效的。