13

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たが、それでも最後のelse句にイベントが出力されないため、イベントがトリガーされていないだけだと思います。これに関する助けをいただければ幸いです。

4

4 に答える 4

19

Ncursesでマウスイベントをまったくキャプチャできない理由を理解しようとしてここに来る他の人にとって、おそらくこれはあなたが必要とする行です:

keypad(window, TRUE);      

これがないと、でマウスイベントを取得できませんでしたgetch()

私が見たすべてのチュートリアル/例から欠落しているため、コードの何が問題であるかを理解するのに多くの時間がかかりました-おそらくこの答えは、他の人が私よりも早く解決策を見つけるのに役立つでしょう。

于 2012-12-14T22:18:34.560 に答える
3

マウスの右ボタンはボタン2ではなくボタン3です。ボタン2は真ん中のボタンです。

于 2012-07-04T10:24:48.187 に答える
2

元々の質問は、ターミナルエミュレーター(およびマウスクリックをアプリケーションに渡すことを妨げるメニューのアクティブ化)に関するものでした。これは、端末固有のドキュメント(またはチュートリアル)で対処できた可能性があります。他の回答はその点を見逃し、xtermプロトコルのマウスイベントを受信する(そして理解する)ncursesアプリケーションの問題に焦点を当てました。

後者の問題はマニュアルページに記載されています:

下のマウスイベント は、さまざまなファンクションキーとして解釈されるため、ビットがオフxtermのウィンドウでは正しく検出されません 。keypadterminfoの説明は (マウスクリックに対するxtermからの応答の開始)にkmous 設定されて いる必要があります。"\E[M"の他の値kmousも許可されますが、同じ仮定の下で、つまり、応答の始まりです。

新しいものではなく、 1995年に最初に言及されました:

xtermでのマウスイベントは、キーパッドビットがオフのウィンドウでは正しく検出されません。

于 2020-01-19T12:00:38.837 に答える
0

私はあなたのコードを使用していましたが、何の反応も得られません。マウスの左ボタンでも機能しません。

これは完全なコードですか?

#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; 
}
于 2012-11-09T14:33:42.180 に答える