【问题标题】:AIX/XP Curses get key/modifier key in a cross platform fashionAIX/XP 诅咒以跨平台方式获取密钥/修饰符密钥
【发布时间】:2010-11-20 02:18:24
【问题描述】:

我正在开发一个简单的控制台应用程序,让我的脚再次被诅咒弄湿。我在将我的应用程序从 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 是 ctrl-down 箭头的响应。 我认识到 27/29/66 可能是标准转义序列之一。 我希望 curses 将其映射到单个值。 XP 端在 curses.h 文件中定义了一个 CTL_DOWN。 AIX 端没有。

所以我的问题是

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

搜索 AIX 在线资料让我的眼睛充满了血丝。 任何帮助我指出正确方向的帮助将不胜感激。

其他随机信息

我正在运行带有最新服务包的 xp pro msvc 6,带有 service pack 6。curses 库是 pdcurses

另一个编译器是IBM XL C/C++ ENTERPRISE EDITION V8.0 编译使用

xlc++ -g app.cpp -lcurses

我在电脑上使用 pdcurses33 以及 AIX 上的本机诅咒。

【问题讨论】:

  • 你使用的是哪个curses库?
  • 好收获。它已添加到问题中。

标签: windows-xp keyboard cross-platform aix curses


【解决方案1】:

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

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

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

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

【讨论】:

  • 至少是一个想法。谢谢
【解决方案2】:

Re: [PDCurses] Windows 上的 Alt + Shift + n(例如)

LM 2002 年 7 月 12 日星期五 08:13:53 -0700

2002 年 7 月 7 日下午 6:10:00,杰里米·史密斯写道:

我遇到了一些问题。我在中使用诅咒函数 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 报告使用哪个键按下 两个 kptab 表(kptab 和 ext_kptab),所以如果组合不是 在表格中,您可能没有看到它。您也许可以添加一些 如果缺少某些内容,请对表格进行定义。还有一些代码 在设置状态的同一例程中(BUTTON_SHIFT、BUTTON_CONTROL、 BUTTON_ALT),但这似乎是用于鼠标输入。所以你可以检查 MOUSE_STATUS 结构中的这些键。这仅适用于 窗口实现。每个平台都有独特的计算方式 按下了哪些键。

在 16 位 DOS 中,我曾经改变 shift、caps lock 和 num lock 的状态 通过更改十六进制 417 地址的设置。这仅适用于真实 模式程序。许多新的 Windows 编译器甚至不允许你 不再使用功能直接访问 BIOS 或内存。 16位 位于 hex 417 和 hex 418 的位置表示右移已 通过设置 417 地址的最高位,左移,按下 设置字节中的第二高位,通过设置 ctrl 键 次高,然后按次高的 alt 键。 418 address 保存左右 alt 和 控制键被按下。

看来您可能需要对您的 特定版本的 curses 以获得您想要的。诅咒是一个 非常便携的用户界面,因此它通常支持最低通用 某些平台上的功能分母。

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

最好的祝愿。

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

看来我需要自己进行键盘解码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2018-11-29
    • 1970-01-01
    相关资源
    最近更新 更多