在AwayMode中唤醒Windows

时间:2017-05-19 17:17:36

标签: c++ winapi

我正在使用Windows AwayMode 来关闭显示器和音频,而不是进入睡眠模式。这工作正常。我如何醒来"当我想要的事件发生时系统?我可以检测到该事件,但我不知道如何重新启动显示器并使系统再次显示为唤醒状态。

我已尝试GetCursorPos()SetCursorPos()尝试移动光标,但这不起作用。

我也试过CreateWaitableTimer()SetWaitableTimer(),但这也没有用。我将 fResume 选项设置为TRUE。

我还尝试使用PowerSetRequest()句柄关闭 AwayMode 并将其设置为NULL。这也行不通。

我也试过SetThreadExecutionState()电话,没有运气。此处还定义了 AwayMode 。我试图设置并清除它,但显​​示器不会重新开启。

1 个答案:

答案 0 :(得分:0)

我找到了一种方法,可以通过鼠标移动使用 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);