1

もう一度呪いで足を濡らすために、シンプルなコンソールアプリに取り組んでいます。アプリをxpからAIXに移植する際に少し問題があります。これがコードのサンプルチャンクです。

int main(void)
{
    WINDOW *_window = initscr(); 
    int _rows;
    int _cols;

    cbreak();

    /* Accept all keys */ 
    keypad(_window, true);

    /* Don't echo things that are typed */ 
    noecho();

    /* Get the screen dimensions */ 
    getmaxyx(_window, _rows, _cols);

    /* Don't display cursor */ 
    curs_set(0);

    for (;;)
    {
        printw("Press a Key ");
        refresh();
        int key = wgetch(_window);
        printw("%d \n", key);
    }

    endwin();

    return 0;
}

XPでこれを実行すると、DOWNARROWの後にCTRL-DOWNARROWが続く次の出力が得られます。

Press a Key 258
Press a Key 481
Press a Key

258は下矢印のコードであり、481はctrl-下矢印のコードです。

AIXでこれと同じテストを実行します。

Press a Key 1858
Press a Key 27
Press a Key 79
Press a Key 66
Press a Key

1858は下向き矢印で、27/29/66は下向き矢印の応答です。27/29/66はおそらく標準のエスケープシーケンスの1つであることを認識しています。私は呪いがそれを単一の値にマッピングすることを望んでいました。XP側には、curses.hファイルで定義されたCTL_DOWNがあります。AIX側はそうではありません。

だからここでの私の質問は

それらは私がここで見逃したいくつかの呪文ですか、それはそれらの3つの文字を素敵なユニークな整数に魔法のようにマッピングしますか?または、プラットフォーム固有のキーストロークを実際のアプリで使用できるものに隠すために、ある種のクラスを作成する必要がありますか?

私の目は、AIXオンラインのものを検索することからの血のショットです。私を正しい方向に向けるための助けをいただければ幸いです。

その他のランダムな情報

最新のサービスパックmsvc6、サービスパック6でxpproを実行しています。cursesライブラリはpdcursesです。

他のコンパイラーはIBMXLC / C ++ ENTERPRISEEDITIONV8.0です。

xlc ++ -g app.cpp -lcurses

PCではpdcurses33を使用し、AIXではネイティブのcursesを使用しています。

4

2 に答える 2

1

IBM 固有のハードウェアおよびソフトウェア ライブラリに重点を置いた AIX 提供のライブラリではなく、オープン ソースの「ncurses」ライブラリを使用してみることができます。

そこに xlC 互換バージョンがあるかどうか正確に思い出せないので、ソースからライブラリをビルドするか、「gcc」に切り替える必要があるかもしれません。Thier は Windows 用の ncurses のバージョンでもあるため、コードの元のバージョンに変更をバックポートできる場合があります。

コントロールキーの数字ではなく、UP_ARROW などの論理名をサポートする ncurse の漠然とした記憶があります。プラットフォーム、端末エミュレーション、NLS 設定などに依存する問題は、単純な上向き矢印が「UP_ARROW」、「Esc_UP」、「Cntrl_K」として返される可能性があります。

前回、curses アプリケーションを別のプラットフォームに移植しなければならなかったとき (これは比較的簡単な AIX から Solaris への移植でした)、「MEANT_UP」のような 1 つの論理的な「意図」に複数のキー ストロークをマッピングしたことを覚えています。

于 2009-08-25T08:26:43.967 に答える
0

Re: [PDCurses] Windows では Alt + Shift + n (例)

LM 金、2002 年 7 月 12 日 08:13:53 -0700

2002 年 7 月 7 日午後 6:10:00 に、ジェレミー スミスは次のように書いています。

少し問題が発生しました。「n」や Alt+「n」などのキーに対して、プログラムで Curses 関数 getch() を使用していますが、これらの組み合わせを検出するにはどうすればよいですか。

Ctrl+n Alt+Shift+n Ctrl+Alt+n Ctrl+Alt+Shift+n

Shift+Alt+2 を実際のキーコード (Shift、Alt、または 2 とは異なる) として返すには、何らかのフラグが必要だと思いますが、方法がわかりません。:-(

curses.h のファイルのヘッダーを確認したところ、いくつかの ALT の組み合わせといくつかのコントロールの組み合わせを含む、キーボードから取得できるすべての標準スキャン コードがリストされているようです。

次に、文字を取得するための Windows の実装を確認しました。pdckbd.c では、ルーチン win32_kbhit が ReadConsoleInput を呼び出します。Shift、Alt、Control、およびその他のステータス キーは、dwControlKeyState でこの関数から返されます。PDC_get_bios_key は、2 つの kptab テーブル (kptab と ext_kptab) を使用してどのキーが押されたかを報告するため、組み合わせがテーブルにない場合は、おそらく表示されません。何かが不足している場合は、いくつかの定義をテーブルに追加できる場合があります。同じルーチン内に状態 (BUTTON_SHIFT、BUTTON_CONTROL、BUTTON_ALT) を設定するコードもありますが、これはマウス入力用のようです。したがって、これらのキーは MOUSE_STATUS 構造体で確認できます。これは、Windows の実装にのみ関係します。すべてのプラットフォームには、押されたキーを特定する独自の方法があります。

16 ビット DOS では、16 進アドレス 417 の設定を変更することで、シフト、Caps Lock、および Num Lock の状態を変更していました。これは、リアル モード プログラムでのみ機能します。新しい Windows コンパイラの多くは、BIOS やメモリに直接アクセスすることさえできなくなりました。16 進数 417 と 16 進数 418 の 16 ビット位置は、417 アドレスに最上位ビットを設定することによって右シフトが押されたことを示します。その後、次に高いキーで Alt キーを押します。418 アドレスには、右または左の Alt キーと Control キーが押されたかどうかのステータスが保持されます。

あなたが望むものを正確に得るためには、特定のバージョンのcursesにいくつかの変更を加える必要があるようです. Curses は非常に移植性の高いユーザー インターフェイスであるため、多くの場合、一部のプラットフォームでは機能の最小公分母をサポートします。

ところで、国際文字のサポートを含む新しい curses 標準の作業が進行中であることを読んだことを覚えています。この取り組みについて、さらに何か聞いた人はいますか?

幸運をお祈りしています。

ローラ・マイケルズ http://www.distasis.com

自分でキーボードのデコードを行う必要があるようです。

于 2009-08-25T14:27:26.543 に答える