如何停止将显示器进入睡眠状态的睡眠(时间)

时间:2019-05-12 05:42:43

标签: c++ windows multithreading visual-c++ visual-studio-2017

我编写了一个多线程程序,其中工作线程执行由Sleep()调用隔开的按键循环,直到按下ESC键为止,而主线程等待ESC按键,并在检测到时告诉工作线程退出。

它可以正常运行并执行应有的操作,但是问题是Sleep()调用导致我的显示器在该时间关闭

我已经完全在电源管理设置中禁用了监视睡眠,并尝试用this_thread :: sleep_for(chrono :: seconds(3))替换Sleep()函数。这两个函数产生完全相同的结果。

...
kInput.ki.wVk = 0x44; //Press the "D" key
kInput.ki.dwFlags = 0; //0 for key-down
SendInput(1, &kInput, sizeof(INPUT)); //send the input

Sleep(3000); //wait for 3 seconds

kInput.ki.dwFlags = KEYEVENTF_KEYUP; //key release
SendInput(0, &kInput, sizeof(INPUT)); //send release
...

据我所知,Sleep()函数应仅使程序等待指定的时间,然后继续。我从未听说过Sleep()和sleep_for()函数曾经使监视器进入睡眠状态。

1 个答案:

答案 0 :(得分:1)

我认为这是某种省电的方式。 只需播放告诉系统Windows打开显示器的系统消息 像这样

SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

另一个选择是尝试使用InputSimulator NuGet软件包,因为它的级别较低,因此它可能使节电功能认为真正的用户正在使用键盘,这将使其不太可能关闭显示器。

注意:请勿使用此NuGet软件包做危险的事情,因为即使重新启动后,它也会影响您的计算机。我曾经锁过我的班次键。必须编辑我的代码并再次运行以释放它。即使重新启动也无济于事。