Как остановить Sleep (time) от перевода монитора в режим сна - PullRequest
0 голосов
/ 12 мая 2019

Я написал многопоточную программу, в которой рабочий поток выполняет цикл нажатий клавиш с интервалом вызовов Sleep () до нажатия клавиши ESC, в то время как основной поток ожидает нажатия клавиши ESC и при обнаружении сообщает рабочий поток для выхода.

Он работает нормально и делает то, что должен, но проблема в том, что вызовы Sleep () заставляют мой монитор отключить на это время.

Я полностью отключил монитор в своих настройках управления питанием и попытался заменить функцию Sleep () на this_thread :: sleep_for (chrono :: seconds (3)). Обе функции дают одинаковый результат.

...
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 Ответ

1 голос
/ 12 мая 2019

Я думаю, что это какая-то энергосберегающая вещь.Просто транслируйте системный массаж, сообщая Windows, чтобы включить монитор. Вот так

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

Другой вариант - попытаться использовать пакет InputSimulator NuGet, более низкий уровень которого позволяет сделать функцию энергосбережения реальной.пользователь использует клавиатуру, что снижает вероятность выключения монитора.

Примечание: не делайте опасных вещей с этим пакетом NuGet, так как он может повлиять на ваш компьютер даже после перезагрузки.Однажды я запер свой ключ переключения.Пришлось отредактировать мой код и запустить снова, чтобы освободить его.Даже перезагрузка не помогла.

...