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

Ped*_*ori 9 c++ unix curses ncurses mouseevent

我正在为unix平台制作一个控制台应用程序,我正在使用curses(或ncurses)库来处理键盘和鼠标输入.问题是我发现很少有关于如何使用它的文档,从这个页面开始,这个没有非常详细的例子.我已设法捕获左键单击,但我无法让它为右键单击工作,因为终端模拟器的选项菜单出现在光标位置,但该事件未由应用程序处理.如何避免这种情况并在应用程序中捕获事件?

我有以下行来配置鼠标事件:

// Set up mouse event throwing
mousemask(BUTTON1_PRESSED | BUTTON2_PRESSED, NULL);
Run Code Online (Sandbox Code Playgroud)

在处理输入的方法中,我有以下内容:

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;
}
Run Code Online (Sandbox Code Playgroud)

我也尝试mousemask()使用ALL_MOUSE_EVENTS掩码进行配置,但它仍然不会在最后一个else子句上打印任何事件,因此我认为事件不会触发.任何有关这方面的帮助将非常感激.

小智 12

对于其他任何人来到这里试图弄清楚为什么他们不能用Ncurses 完全捕获鼠标事件,很可能这就是你需要的线路:

keypad(window, TRUE);
Run Code Online (Sandbox Code Playgroud)

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

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