我正在使用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/

10-10 18:30