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-down 箭头的代码。

在 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-down 箭头的响应。我认识到 27/29/66 可能是标准转义序列之一。我希望 curses 将其映射到单个值。XP 端在 curses.h 文件中定义了一个 CTL_DOWN。AIX 端没有。

所以我的问题是

它们是我在这里错过的一些咒语吗,它会神奇地将这三个字符映射成一个很好的唯一整数?还是我必须编写某种类来处理将平台特定的击键隐藏到我的真实应用程序可以使用的东西中?

由于搜索 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。

4

2 回答 2

1

您可以尝试使用开源的“ncurses”库,而不是 AIX 提供的库,后者非常适合 IBM 特定的硬件和软件库。

我不记得那里是否有 xlC 兼容版本,因此您可能必须从源代码构建库或切换到“gcc”。Thier 也是 Windows 的 ncurses 版本,因此您可以将更改反向移植到代码的原始版本。

我对 ncurse 有一个模糊的记忆,它支持 UP_ARROW 等逻辑名称,而不是控制键的数字。依赖于平台、终端仿真、NLS 设置等的问题,一个简单的向上箭头可能会返回为“UP_ARROW”、“Esc_UP”、“Cntrl_K”。

我确实记得上次我不得不将 curses 应用程序移植到另一个平台(这是一个相对简单的 AIX 到 Solaris 移植)时,将几个键击映射到一个逻辑“意图”,如“MEANT_UP”。

于 2009-08-25T08:26:43.967 回答
0

回复:[PDCurses] Alt + Shift + n(例如)在 Windows 上

LM 周五,2002 年 7 月 12 日 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。shift、alt、control 和其他状态键在 dwControlKeyState 中从这个函数返回。PDC_get_bios_key 报告使用两个 kptab 表(kptab 和 ext_kptab)按下了哪个键,因此如果该组合不在表中,您可能看不到它。如果缺少某些内容,您可以向表中添加一些定义。在设置状态的同一例程中还有一些代码(BUTTON_SHIFT、BUTTON_CONTROL、BUTTON_ALT),但这似乎是用于鼠标输入的。因此,您可以在 MOUSE_STATUS 结构中检查这些键。这仅适用于 Windows 实现。每个平台都有一种独特的方式来确定按下了哪些键。

在 16 位 DOS 中,我曾经通过更改十六进制 417 地址的设置来更改移位、大写锁定和数字锁定的状态。这仅适用于实模式程序。许多新的 Windows 编译器甚至不再允许您使用函数直接访问 bios 或内存。十六进制 417 和十六进制 418 的 16 位位置表示通过设置 417 地址的最高位已按下右移,通过设置字节中的第二高位,左移,通过设置次高的 ctrl 键然后按次高的 alt 键。418 地址保存是否按下了右或左 alt 和控制键的状态。

似乎您可能必须对特定版本的 curses 进行一些修改才能得到您想要的。Curses 是一个非常便携的用户界面,因此它通常支持某些平台上功能的最低公分母。

顺便说一句,我记得读到有一个新的 curses 标准正在进行中,其中包括国际字符支持。有没有人听到任何关于这项工作的进一步消息?

最良好的祝愿。

劳拉·迈克尔斯 http://www.distasis.com

看起来我需要自己做键盘解码。

于 2009-08-25T14:27:26.543 回答