Обнаружение событий клавиатуры и мыши для Screensaver C ++ - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь создать себе простую заставку на C ++ с windows.h и PDCurses.

Основной частью заставок является закрытие заставки, когда мышь перемещают, нажимают или нажимают на клавиатуру... и т. д.

Я пытался найти способ для PDCurses воспринимать любое событие мыши, но безрезультатно, и способ сделать это с помощью windows.h слишком сложен для новичка в C ++, такого как я,и я не могу придумать способ восприятия событий клавиатуры. Вот мой код:

#include <windows.h>
#include <curses.h> //actually PDCurses is what I have.

int main()
{
    SetConsoleDisplayMode(GetStdHandle(STD_OUTPUT_HANDLE), CONSOLE_FULLSCREEN_MODE, 0);
    initscr();
    raw();
    keypad(stdscr, TRUE);
    noecho();
    curs_set(0);
    int doty = 1, dotx = 1, xm = 1, ym = 1, maxy, maxx;
    getmaxyx(stdscr, maxy, maxx);
    while(1){
        clear();
        mvaddch(doty - 1, dotx - 1, char(219));
        refresh();
        delay_output(35);
        if (doty >= maxy) ym = -1;
        if (dotx >= maxx) xm = -1;
        if (doty <= 1) ym = 1;
        if (dotx <= 1) xm = 1;
        dotx += xm;
        doty += ym;
    }
    endwin();
    return 0;
}

Как бы я обнаружил события клавиатуры или мыши?

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Извините за поздний ответ, так как я дал вам ссылку на сайт, который помог вам с вводом с клавиатуры и распознаванием мыши. Для обнаружения кнопки мыши, посетите этот веб-сайт:

https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-mousemove? redirectedfrom = MSDN

Я думаю, вы могли бы сделать это в своем коде (для левой кнопки мыши, которую нажимают):

if(0x0001)

{

// code

}

0 голосов
/ 19 октября 2019

Существуют ограничения на то, какие события вы можете обнаружить с помощью PDCurses - например, он не будет сообщать о событии для движения мыши без нажатия кнопки. Но, чтобы захватить все события, которые вы можете - добавьте эти строки перед циклом while:

nodelay(stdscr, TRUE);
mouse_on(ALL_MOUSE_EVENTS);
PDC_return_key_modifers(TRUE);

и внутри цикла добавьте:

int c = getch();
if (c != ERR)
    break;

Я только что проверил это (за исключением строк Windows), и получил ошибку при ссылке на char(219) - я предлагаю заменить это на ACS_BLOCK. (Сделано, все заработало, как и ожидалось.)

Редактировать: я добавил PDC_return_key_modifers(TRUE), чтобы, например, клавиша Shift также вышла из цикла.

...