Использование ncurses для захвата щелчков мыши в консольном приложении
Я делаю консольное приложение для платформ unix, и я использую библиотеку curses (или ncurses) для обработки ввода с клавиатуры и мыши. Проблема в том, что я нашел очень мало документации о том , как именно использовать его для этого, например, на этой странице и на этой, где нет очень подробных примеров. Мне удалось захватить левый клик, но я не могу заставить его работать для правого клика, потому что меню опций для эмулятора терминала появляется в месте расположения курсора, но событие не обрабатывается приложением. Как этого избежать и зафиксировать событие в приложении?
У меня есть следующая строка для настройки событий мыши:
// Set up mouse event throwing
mousemask(BUTTON1_PRESSED | BUTTON2_PRESSED, NULL);
И в методе, который обрабатывает входные данные, у меня есть следующее:
int c = getch();
MEVENT event;
switch(c)
{
case KEY_UP:
... do stuff
break;
case KEY_DOWN:
... do stuff
break;
case KEY_MOUSE:
if(getmouse(&event) == OK)
{
if(event.bstate & BUTTON1_PRESSED) // This works for left-click
{
... do stuff
}
else if(event.bstate & BUTTON2_PRESSED) // This doesn't capture right-click
{
... do other stuff
}
else
fprintf(stderr, "Event: %i", event.bstate); // Doesn't print anything on right-click
}
break;
default:
return;
}
Я также пытался настроить mousemask()
с ALL_MOUSE_EVENTS
маски ALL_MOUSE_EVENTS, но она по-прежнему не печатает никаких событий в последнем предложении else, поэтому я считаю, что событие просто не запускается.
Любая помощь в этом будет очень признательна.





Ответы - Использование ncurses для захвата щелчков мыши в консольном приложении / Using ncurses to capture mouse clicks on a console application



09.11.2012 06:33:42
Я использовал ваш код, но не могу получить никакой реакции. Даже левый мышелов не работает.
Это у вас полный код?
#include <ncurses.h>
int main(int argc, char **argv){
while(1)
{
mousemask( ALL_MOUSE_EVENTS, NULL);
int c = getch();
MEVENT event;
switch(c)
{
case KEY_UP:
printf("keyup");
break;
case KEY_DOWN:
printf("keydown");
break;
case KEY_MOUSE:
if(getmouse(&event) == OK)
{
if(event.bstate & BUTTON1_PRESSED) // This works for left-click
{
printf("button1");
}
else if(event.bstate & BUTTON2_PRESSED) // This doesn't capture right-click
{
printf("button2");
}
else
printf("Event: %i", event.bstate); // Doesn't print anything on right-click
}
break;
}
}
return 0;
}

BUTTON0_CLICKED
и BUTTON3_CLICKED
для левой и правой кнопок? Те, что были нажаты, на меня не действовали.



15.12.2012 02:18:34
Для тех, кто еще приходит сюда, пытаясь выяснить, почему он/она не может захватить события мыши вообще с Ncurses, скорее всего, это линия, которая вам нужна:
keypad(window, TRUE);
Без этого я не получал никаких событий мыши с getch()
.
Он отсутствует во всех учебниках/примерах, которые я видел, поэтому мне потребовалось много времени, чтобы понять, что было не так с моим кодом - возможно, этот ответ поможет другим найти решение быстрее, чем я.



19.01.2020 03:00:38
Первоначально речь шла об эмуляторах терминалов (и активации меню, мешающей передаче щелчков мыши приложению). Это можно было бы решить с помощью какой-нибудь специфичной для терминала документации (или даже какого-нибудь учебника). Другие ответы упустили этот момент и сосредоточились на проблемах в приложении ncurses, получающем (и имеющем смысл) события мыши протокола xterm.
Последний вопрос задокументирован на странице руководства:
События мыши в
xterm
не будут правильно обнаружены в окне с егоkeypad
откусил, так как они интерпретируются как различные функциональная клавиша. Ваше описание terminfo должно иметьkmous
(начало ответа от xterm для щелчков мыши). Другие значения для"\E[M"
допускаются, но при том же допущении, то есть, это начало реакции.
не новый, впервые упоминается в 1995 году:
События мыши под xterm не будут правильно обнаружены в окне с его клавиатура была откушена.