Hàm getch() trả về hai mã khóa cho các phím mũi tên (và một số phím đặc biệt khác), như đã đề cập trong phần bình luận của FatalError. Nó trả về 0 (0x00) hoặc 224 (0xE0) đầu tiên, và sau đó trả về một mã xác định khóa đã được nhấn.
Đối với các phím mũi tên, nó trả về 224 trước, sau đó là 72 (lên), 80 (xuống), 75 (trái) và 77 (bên phải). Nếu nhấn phím mũi tên num-pad (với NumLock), getch() trả về 0 đầu tiên thay vì 224.
Xin lưu ý rằng getch() không được chuẩn hóa theo bất kỳ cách nào và các mã này có thể khác nhau từ trình biên dịch sang trình biên dịch. Các mã này được trả về bởi MinGW và Visual C++ trên Windows.
Một chương trình tiện dụng để xem hành động của getch() cho các phím khác nhau là:
#include <stdio.h>
#include <conio.h>
int main()
{
int ch;
while ((ch = _getch()) != 27) /* 27 = Esc key */
{
printf("%d", ch);
if (ch == 0 || ch == 224)
printf (", %d", _getch());
printf("\n");
}
printf("ESC %d\n", ch);
return (0);
}
này làm việc cho MinGW và Visual C++. Các trình biên dịch này sử dụng tên _getch() thay vì getch() để chỉ ra rằng nó là một hàm không chuẩn.
Vì vậy, bạn có thể làm điều gì đó như:
ch = _getch();
if (ch == 0 || ch == 224)
{
switch (_getch())
{
case 72:
/* Code for up arrow handling */
break;
case 80:
/* Code for down arrow handling */
break;
/* ... etc ... */
}
}
Nguồn
2012-05-06 18:59:44
Đã lâu rồi kể từ khi tôi chơi với điều này, nó không phải là chuẩn bit ít nhất ... nhưng trở lại khi tôi chơi với 'getch()', cho các phím "đặc biệt" nó thực sự trả về hai lần. Lần đầu tiên nó trả về một 0, sau đó một mã cho khóa đặc biệt, để bạn có thể nói nó ngoài các phím khác. – FatalError
'65' chỉ dành cho ký tự' A'. Bạn phải sử dụng các mã điều khiển để nhận các khóa này. Xem bài đăng này. http://stackoverflow.com/questions/2876275/what-are-the-ascii-values-of-up-down-left-right –