Я пытаюсь создать программу, которая может выключать монитор комбинацией клавиш и снова включать его другой. Кнопка питания отвалилась, поэтому монитор в основном остается включенным. Я заметил, что отправка WM_SYSCOMMAND с WPARAM SC_MONITORPOWER, вероятно, сработает, но на самом деле это не так.
Сначала я попытался вставить несколько GetAsyncKeyState () в мой обработчик сообщений, но всякий раз, когда я пытался его запустить, мои нажатия клавиш не воспринимались.
while (GetMessage(&Msg, NULL, 0, 0) > 0) // main message pump
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
if (GetAsyncKeyState (0x31) & 0x8000) SendMessage (hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, 2); // turn monitor off if '1' is pressed
if (GetAsyncKeyState (0x32) & 0x8000) SendMessage (hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, -1); // turn monitor on if '2' is pressed
if (GetAsyncKeyState (0x33) & 0x8000) PostMessage (cmd, WM_CLOSE, 0, 0); // close console window if '3' is pressed (it even comes with the windows projects for some reason so I just hide it+deal with it
}
Я пытался переместить GetAsyncKeyState () до того, как сообщение заработает. Я попытался использовать цикл while (true) и включить в него GetMessage ().
Единственное, что начало работать, это закомментировать все ссылки на насос сообщений в цикле. Это приведет к нажатию клавиш, но при нажатии «1» (0x31) монитор погаснет (индикатор питания останется постоянным) в течение нескольких секунд, прежде чем включится. Использование значения 1 для LPARAM для перехода в режим пониженного энергопотребления сделало бы то же самое. Нажатие «2», когда было темно, ничего не сделает.
Мое объяснение этому заключается в том, что, поскольку я отключил очередь сообщений, DefWindowProc () никогда не мог обрабатывать эти сообщения и, следовательно, они приводили к неверным результатам.
Я думал о настройке цикла при нажатии «1», чтобы постоянно выключать монитор на несколько секунд, пока не будет нажата «2», но я решил, что уже сделал достаточно плохих вещей с кодом (окно без цикла обработки сообщений) и наличие такого плохого кода может как-то испортить момент, когда мне, скорее всего, понадобится эта информация позже.
Все, что в моей оконной процедуре - это WM_CLOSE с DestroyWindow (), WM_DESTROY, который показывает скрытое окно и вызывает PostQuitMessage () и DefWindowProc.
Итак, в основном мой вопрос сводится к тому, «Как я могу использовать GetAsyncKeyState с моим насосом сообщений?». Кроме того, я заметил, что WM_POWERBROADCAST может достичь этого тоже. Один лучше использовать?
РЕДАКТИРОВАТЬ: прокомментировал код, чтобы вы знали немного больше
РЕДАКТИРОВАТЬ: RegisterHotKey () исправил одну проблему, но монитор по-прежнему гаснет только на несколько секунд (индикатор питания горит постоянно)