我正在使用Windows AwayMode关闭显示器和音频,而不是进入睡眠模式。一切正常。当我想要的事件发生时,如何“唤醒”系统?我可以检测到该事件,但是我不知道如何重新打开显示器并使系统再次醒来。
我试过了GetCursorPos()
和SetCursorPos()
来尝试移动光标,但这没有用。
我也尝试了CreateWaitableTimer()
和SetWaitableTimer()
,但是那也不起作用。我将fResume选项设置为TRUE。
我还尝试使用PowerSetRequest()
句柄关闭AwayMode并将其设置为NULL
。那也没有用。
我也尝试过SetThreadExecutionState()
调用,但是没有运气。这里也定义了一个AwayMode。我试图进行设置并清除它,但是显示器没有重新打开。
最佳答案
我找到了一种使用 SendInput()和鼠标移动的方法。我还必须使用 SetThreadExecutionState()来让系统知道用户的存在,否则它将在2秒钟内返回AwayMode。这是我使用的代码。
// Get the current position to ensure we put it back at the end
POINT pt;
GetCursorPos(&pt);
// Make a mouse movement
// Go to upper left corner (0,0)
INPUT input;
input.type = INPUT_MOUSE;
input.mi.mouseData = 0;
input.mi.dx = 0;
input.mi.dy = 0;
input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
SendInput(1, &input, sizeof(input));
Sleep(5); // Just in case this is needed
// Go to lower right corner (65535,65535)
input.mi.dx = 65535;
input.mi.dy = 65535;
input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
SendInput(1, &input, sizeof(input));
Sleep(5); // Just in case this is needed
// Restore to original
SetCursorPos(pt.x, pt.y);
// Now let the system know a user is present
DWORD state = SetThreadExecutionState(ES_DISPLAY_REQUIRED | ES_SYSTEM_REQUIRED);
关于c++ - 在AwayMode中唤醒Windows,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44075652/