使用ncurses捕获控制台应用程序上的鼠标点击

我正在为unix平台做一个控制台应用程序,并使用curses(或ncurses)库来处理键盘和鼠标input。 问题是,我发现很less有关于如何使用它的文档,从这个页面 appart和这个没有非常详细的例子。 我已经设法捕获左键单击,但是我无法让它为右键单击工作,因为terminal模拟器的选项菜单出现在光标位置,但事件不被应用程序处理。 我怎样才能避免这种情况,并在应用程序中捕获事件?

我有以下行configuration鼠标事件:

// Set up mouse event throwing mousemask(BUTTON1_PRESSED | BUTTON2_PRESSED, NULL); 

而在处理input的方法中,我有以下几点:

 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; } 

我也试着用ALL_MOUSE_EVENTS掩码configurationmousemask() ,但是它仍然不会在最后一个else子句中打印任何事件,所以我认为这个事件根本不是触发的。 任何帮助,将不胜感激。

对于任何人来这里试图找出为什么他/她不能用Ncurses 来捕捉鼠标事件 ,很可能这是你需要的行:

 keypad(window, TRUE); 

没有这个,我没有得到任何与getch()鼠标事件。

在我看到的所有教程/示例中都没有提到它,这就是为什么我花了很多时间来弄清楚我的代码出了什么问题 – 也许这个答案会帮助其他人比我更快地找到解决方案。

鼠标右键是按钮3,而不是按钮2.按钮2是中间的一个。

我正在使用你的代码,但我不能得到任何反应。 甚至没有鼠标左键的作品。

这是你的完整代码吗?

 #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; }