关于 linux:如何使用 C 阻止退格键出现在 nCurses 中?
How to stop backspace from appearing in nCurses using C?
我目前正在编写一个 ncurses shell,为了读取输入,逐个字符地读取它很重要,因此我使用的是 mvwgetch 命令。并在逐字符读取时递增计数器。问题是,每当我按下箭头键或退格键时,它们的输出就会被打印出来。因此,例如,如果我按退格键,则正在打印 ^?。
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
while ((command[i] = mvwgetch(promptwin, promptline, posx)) != '
') { if (command[i] == 7) { // if entered character is a backspace i =-2; posx =- 2; mvwdelch(promptwin, promptline, posx); mvwdelch(promptwin, promptline, posx - 1); command[i] = '\0'; } else { posx++; posyx[1] = posx; wmove(promptwin, promptline, posx); } i++; } |
需要读取字符以跟踪光标在屏幕上的位置。在我的代码中,我尝试解决这个问题,但它仍然显示这些字符。 PS:在linux上工作。
相关讨论
- 你是如何初始化你的 nCurses shell的?你在你的程序中使用 noecho 吗?你能分享更多的代码吗?这对我们来说有点帮助。如果您使用预定义的 maros 而不是键码的硬编码值,那就太好了:
- 我应该上传什么部分?我没有使用 noecho 因为否则,它不会在 shell 上打印。
- 实际上,我对自己调试您的代码很感兴趣。您可以共享发布此片段的文件。如果您不想在帖子中发送垃圾邮件,可以通过 pastebin 共享代码。
-
唔。添加 mvwscanw(promptwin, promptline, posx,"%[^
]", command); 可以解决退格问题,但无法正确处理箭头键。 - 问题是我想知道光标的位置,因为程序每秒更新一个单独的窗口,因此 x 坐标通过共享内存段传递,然后它被移回它离开的位置。
已解决
原来问题是退格的代码是 127。因此它没有被识别。为了处理退格,它现在执行以下代码。
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
if(c == 127 || c == 8){ //if character inserted is backspace or delete
if(posx != tcount) { mvwprintw(promptwin, promptline, (posx + 1),""); mvwprintw(promptwin, promptline, posx,""); mvwprintw(promptwin, promptline, (posx - 1),""); wmove(promptwin, promptline, (posx - 2)); command[(chara - 1)] = '\0'; chara--; posx--; posyx[1] = posx; } else { mvwprintw(promptwin, promptline, (posx + 1),""); mvwprintw(promptwin, promptline, posx,""); } } else { command[chara] = c; posx++; posyx[1] = posx; wmove(promptwin, promptline, posx); chara++; } |
首先,7 不是退格键——7 是铃声。您想要 8。您还可以检查 KEY_BACKSPACE。
你提到不使用 noecho(),但这正是你必须做的来抑制特殊字符的输出。然后你可以明确地 addch() 你想要出现的那些(可打印的字符)。
相关讨论
- 使用 noecho() 的问题是,我必须打印用户插入的每个字符。
- 我不明白为什么这是个问题。