Выключение экрана WinAPI C++

283
24 декабря 2017, 09:36

Только учусь winAPI, весь вечер вчера пытался написать программу, которая бы выключала экран и включала при нажатие на клавишу F2, код ниже. Проблема в том, что при появлении окошка нажимаю на ОК и программа закрывается, не выполняя мою функцию NewWndProc, подскажите, что делать? Решил выключать экран в цикле, т.к без него экран загорается при передвижении мышкой или нажатии на клавиатуру.

КОД С++

#include <Windows.h>
#include <conio.h>
#include <winuser.h>
struct project1 {
    LONG pPrevProc;
}ppjct1;
LRESULT CALLBACK NewWndProc(HWND   hwnd, UINT   uMsg, WPARAM wParam, LPARAM lParam) {
    bool key = true;
    while (key) {
        SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
        switch (uMsg) {
        case WM_KEYUP:
            switch (wParam) {
            case VK_F2:
                {
                key = false;
                break;
                }
            }
        }
    }
    return CallWindowProc(WNDPROC(ppjct1.pPrevProc), hwnd, uMsg, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    MessageBox(NULL, (LPCWSTR)L"Programm is started!", (LPCWSTR)L"Screen killer", MB_OK);
    ppjct1.pPrevProc = SetWindowLongPtr(NULL, GWL_WNDPROC, (LONG_PTR)NewWndProc);
    SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
}
Answer 1

Вызов SetWindowLongPtr с NULL в качестве первого параметра ничего не делает. Выключать монитор в цикле также бесполезно, так как он по факту будет все время включаться - выключаться. Если хотите выключать экран, то придется копать глубже и отключать его полностью.

READ ALSO
Что быстрее в длинном цикле - макрос или inline?

Что быстрее в длинном цикле - макрос или inline?

Например, есть цикл перевода YUY2 буфера в буфер BGR (от 100 до 900+ тысяч итераций):

232
Замена strcpy и ошибки C4996, E0304, C2660

Замена strcpy и ошибки C4996, E0304, C2660

Как можно заменить strcpy не теряя работоспособности?

987
Найти максимальные элементы в матрице

Найти максимальные элементы в матрице

Нужно найти максимальные элементы в матрице и вывести их отдельно Код есть, но не знаю как доработать

220
QSlider C++ трекинг

QSlider C++ трекинг

Как при изменении значения слайдера вызывать определённый метод? Пробовал вот так, но CLion выдаёт ошибку:

217