我正在使用Windows AwayMode 来关闭显示器和音频,而不是进入睡眠模式。这工作正常。我如何醒来"当我想要的事件发生时系统?我可以检测到该事件,但我不知道如何重新启动显示器并使系统再次显示为唤醒状态。
我已尝试GetCursorPos()
和SetCursorPos()
尝试移动光标,但这不起作用。
我也试过CreateWaitableTimer()
和SetWaitableTimer()
,但这也没有用。我将 fResume 选项设置为TRUE。
我还尝试使用PowerSetRequest()
句柄关闭 AwayMode 并将其设置为NULL
。这也行不通。
我也试过SetThreadExecutionState()
电话,没有运气。此处还定义了 AwayMode 。我试图设置并清除它,但显示器不会重新开启。
答案 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);