OS X-if语句中的按键 对于C++编程和使用MAC作为计算机,我是很新的。 我已经在互联网上搜索了一段时间,但是我仍然找不到解决我问题的好方法

OS X-if语句中的按键 对于C++编程和使用MAC作为计算机,我是很新的。 我已经在互联网上搜索了一段时间,但是我仍然找不到解决我问题的好方法,c++,macos,C++,Macos,我正在制作一个带有键盘箭头的项目,但我不知道如何在if语句中生成Keypress函数 因此,我正在寻找的解决方案是: if (up arrow is pressed) { std::cout << it worked! << std::endl; } 资料: LLVM编译器,Xcodes命令行工具,Unix,OS X-Sierra 谢谢您的帮助。我已将代码整合到一个程序中,您可以看到它是如何工作的 #include <stdio.h> #includ

我正在制作一个带有键盘箭头的项目,但我不知道如何在if语句中生成Keypress函数

因此,我正在寻找的解决方案是:

if (up arrow is pressed) {
    std::cout << it worked! << std::endl;
}
资料: LLVM编译器,Xcodes命令行工具,Unix,OS X-Sierra 谢谢您的帮助。

我已将代码整合到一个程序中,您可以看到它是如何工作的

#include <stdio.h>
#include <sgtty.h>

static struct sgttyb savemodes;
static int havemodes = 0;

int tty_break()
{
    struct sgttyb modmodes;
    if(ioctl(fileno(stdin), TIOCGETP, &savemodes) < 0)
        return -1;
    havemodes = 1;
    modmodes = savemodes;
    modmodes.sg_flags |= CBREAK;
    return ioctl(fileno(stdin), TIOCSETN, &modmodes);
}

int tty_getchar()
{
    return getchar();
}

int tty_fix()
{
    if(!havemodes)
        return 0;
    return ioctl(fileno(stdin), TIOCSETN, &savemodes);
}

main()
{
    int i;
    if(tty_break() != 0)
        return 1;
    for(i = 0; i < 10; i++)
        printf(" = %d\n", tty_getchar());
    tty_fix();
    return 0;
}
并使用以下工具运行它:

./main
你会看到↑ 向上箭头键导致以下代码:

27 (Escape)
91
65

注意,代码不是我的-它完全是从我上面提到的C-FAQ中提取出来的。

好吧,我无法在另一个答案中找到代码,不确定有什么不同,因为我也在运行Sierra。但我将其转换为使用tcsetr。该调用的目的是将终端置于原始模式,以便直接发送按键。如果您不这样做,它将不会发送任何内容,直到您按enter键

#include <stdio.h>
#include <termios.h>
#include <unistd.h>

static struct termios savemodes;
static int havemodes = 0;

int tty_break(void)
{
    struct termios modmodes;
    if (tcgetattr(STDIN_FILENO, &savemodes) < 0)
        return -1;
    havemodes = 1;
    modmodes = savemodes;
    cfmakeraw(&modmodes);
    return tcsetattr(STDIN_FILENO, TCSANOW, &modmodes);
}

int tty_getchar(void)
{
    return getchar();
}

int tty_fix(void)
{
    if(!havemodes)
        return 0;
    return tcsetattr(STDIN_FILENO, TCSANOW, &savemodes);
}

int
main(int argc, char *argv[])
{
    int i;
    if(tty_break() != 0)
        return 1;
    for(i = 0; i < 10; i++)
        printf(" = %d\n", tty_getchar());
    tty_fix();
    return 0;
}

我们需要更多地了解环境。这是一个OSXGUI应用程序、一个CLI工具、一个SDL应用程序还是其他什么?好吧,等等……你是在用诅咒来控制屏幕吗?如果是这样的话,答案就在诅咒的文档中。如果不是的话,答案就更难了。不,我显然没有使用任何游标来控制屏幕。我认为这在OSX上不起作用,应该使用TceTattr。另外,我不建议使用K&R风格的代码。@PerJohansson感谢您的想法。它在我的《塞拉》上运行良好。很可能有其他选择——请随意添加答案——越多越好!奇怪的是,我也在管理Sierra,但我无法让它工作。输入了一个tcsetattr版本。好的,如果我在Xcode中的编译器标志中添加-DUSE_OLD_TTY,它就会工作。可能默认情况下,Xcode使用了一个预编译头include,这使得include不起作用。是的,这在我的Sierra上也很好用!我没有使用Xcode,这也许可以解释其中的区别——我只是在终端中使用带有gcc或clang的命令行编译器。谢谢分享。
#include <stdio.h>
#include <termios.h>
#include <unistd.h>

static struct termios savemodes;
static int havemodes = 0;

int tty_break(void)
{
    struct termios modmodes;
    if (tcgetattr(STDIN_FILENO, &savemodes) < 0)
        return -1;
    havemodes = 1;
    modmodes = savemodes;
    cfmakeraw(&modmodes);
    return tcsetattr(STDIN_FILENO, TCSANOW, &modmodes);
}

int tty_getchar(void)
{
    return getchar();
}

int tty_fix(void)
{
    if(!havemodes)
        return 0;
    return tcsetattr(STDIN_FILENO, TCSANOW, &savemodes);
}

int
main(int argc, char *argv[])
{
    int i;
    if(tty_break() != 0)
        return 1;
    for(i = 0; i < 10; i++)
        printf(" = %d\n", tty_getchar());
    tty_fix();
    return 0;
}