質問

私は再び呪いに足を突っ込むためのシンプルなコンソール アプリを開発中です。アプリを 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 で実行すると、下矢印キーに続いて CTRL-下矢印キーを押すと、次の出力が得られます。

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 は Ctrl+下矢印の応答です。27/29/66 はおそらく標準的なエスケープ シーケンスの 1 つであると認識しています。私は、curses がそれを単一の値にマッピングすることを期待していました。XP 側には、curses.h ファイルで CTL_DOWN が定義されています。AIX側はそうではありません。

それで、ここでの私の質問は次のとおりです

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

AIX のオンライン関連の検索で目が充血してしまいました。私を正しい方向に導くための助けをいただければ幸いです。

その他のランダムな情報

私はXP Proを実行しています。最新のサービスパックMSVC 6を使用して、サービスパック6を使用しています。Curses ライブラリは pdcurses です

他のコンパイラはIBM XL C/C ++ Enterprise Edition v8.0です。コンパイルは使用します

xlc++ -g app.cpp -lcurses

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

役に立ちましたか?

解決 2

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

LMの 金, 12 Jul 2002 08:13:53 -0700

2002 年 7 月 7 日午後 6 時 10 分 00 秒に、ジェレミー スミスは次のように書きました。

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

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 を呼び出します。シフト、alt、 コントロールキーとその他のステータスキーは、この関数から dwControlKeyStateです。PDC_get_bios_keyは、どのキーが押されたかを報告します。 2 つの kptab テーブル (kptab と ext_kptab) なので、組み合わせが 表では、おそらく見ていないでしょう。いくつか追加できる場合があります 何かが足りない場合は、テーブルへの定義。また、いくつかのコードもあります 状態 (BUTTON_SHIFT、BUTTON_CONTROL、 BUTTON_ALT)ですが、これはマウス入力用です。だからあなたはチェックすることができます これらのキーは、MOUSE_STATUS 構造にあります。これは、 Windows の実装。すべてのプラットフォームには、独自の方法があります どのキーが押されているか。

16ビットDOSではシフト、capsロック、numlockの状態を変更していました HEX 417 アドレスの設定を変更します。これは実際にのみ機能します モードプログラム。新しい Windows コンパイラの多くは、次のことすら許可していません 機能でBIOSまたはメモリに直接アクセスすることはもうありません。16 ビットの ヘックス417とヘックス418の位置は、右シフトが 417アドレスの最上位ビット(左シフト)を設定することで押されます。 バイトの 2 番目に高いビットである Ctrl キーを設定するには、 次に高く、Alt キーはその次に高いキーです。418 address は、右または左の alt と コントロールキーが押されました。

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

そういえば、新しい 国際文字サポートを含む curses 標準。どなたかいらっしゃいます この取り組みについて、さらに何か聞きましたか?

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

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

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

他のヒント

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

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

UP_ARROW などの論理名をサポートする ncurse についてはうろ覚えです。コントロールキーの数字ではなく。この問題は、プラットフォーム、端末エミュレーション、NLS 設定などに応じて、単純な上矢印が「UP_ARROW」、「Esc_UP」、「Cntrl_K」として返される可能性があります。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top