そこで、C でキーボード アクティビティをキャッチする方法を考えています。ご存知のように、何かを入力して Enter キーを押すと、コンピューターに送信したいものをストリーミングできます。しかし、最初の質問は、上矢印、下矢印などの入力できない文字を入力する方法です (特に、Linux を使用しているが、デフォルトの意味以外の目的で使用したいため、これらの 2 つの文字)、shift、ctrl など。第二に、キーを押した直後にプログラムを進行させる方法です。(Windows の「続行するには何かキーを押してください」のようなものです)。
4 に答える
2 つの方法があります。
stty
コマンドの使用。
system ("/bin/stty raw");
使用する前に追加できますgetchar()
- 詳細については、お問い合わせください
man stty
。
ここを使うtermios.h
- このようにttyのモードを変更する必要があります
newt.c_lflag &= ~(ICANON | ECHO);
- 詳細については、
man termios.h
DOS時代には、kbhit()
機能がありました。その機能が必要な場合は、このスレッドを見ることができます: kbhit() for linux。
ユーザー Thantos の機能を試してみたところ、かなりうまく機能したことをぼんやりと思い出します。
tcgetattr()
最初にとのtcsetattr()
機能について読むことをお勧めします。
Linux を使用している場合、キーボード入力に最適なのは GNU readlineライブラリです。
これにより、必要に応じて emacs および vi 編集モードを含むすべての機能がすぐに利用できます。
/* A static variable for holding the line. */
static char *line_read = (char *)NULL;
/* Read a string, and return a pointer to it. Returns NULL on EOF. */
char *
rl_gets ()
{
/* If the buffer has already been allocated, return the memory to the free pool. */
if (line_read)
{
free (line_read);
line_read = (char *)NULL;
}
/* Get a line from the user. */
line_read = readline ("");
/* If the line has any text in it, save it on the history. */
if (line_read && *line_read)
add_history (line_read);
return (line_read);
}
MITには優れたチュートリアルがいくつかあります。
「ユニバーサル」メソッドは getchar () です。Getchar()" は "バッファリングされた入力" を使用します:ユーザーが "Enter" を押すまで、実際には出力を取得しません。また、コマンド プロンプト (または同等のもの) を使用していない限り、実際には適用できません。
古い DOS のやり方は、"conio.h" からの getch() と getche() でした。このメソッドは、最新のオペレーティング システムをターゲットとする最新の C/C++ ライブラリには存在しません。
提案:
テキストモードの UI を作成したい場合 (特に Linux で)、ncurses を見てください:
(Windows または Linux で) ゲームをプログラミングする場合は、SDL を参照してください。
=== 補遺 ===
私はまだライブラリをお勧めします...しかし、Linuxでの「生のキーボード入力」(別名「未調理」または「非標準」入力)を説明する関数は次のとおりです。
http://cboard.cprogramming.com/c-programming/63166-kbhit-linux.html
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
void changemode(int);
int kbhit(void);
int
main(int argc, char *argv[])
{
int ch;
changemode(1);
while ( !kbhit() )
{
putchar('.');
}
ch = getchar();
printf("\nGot %c\n", ch);
changemode(0);
return 0;
}
void
changemode(int dir)
{
static struct termios oldt, newt;
if ( dir == 1 )
{
tcgetattr( STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt);
}
else
tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
}
int
kbhit (void)
{
struct timeval tv;
fd_set rdfs;
tv.tv_sec = 0;
tv.tv_usec = 0;
FD_ZERO(&rdfs);
FD_SET (STDIN_FILENO, &rdfs);
select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
return FD_ISSET(STDIN_FILENO, &rdfs);
}