例如,当按下 Ctrl 键与任何其他键的某些组合(或者它可能是 Alt 键)时,我想做一些事情。然后从标准输入如何在C程序中读取该组合键作为输入。
我尝试使用简单的getchar()
来了解这些组合的ASCII值。但它有一些关键组合的1到25和一些其他值。是否有任何标准库函数来读取它们。不要问我为什么要那样做。
编辑:我的平台是Windows上的Turbo C.
答案 0 :(得分:3)
简短的回答:以特定于平台的方式。
答案很长:C的输入/输出概念是流标准输出和标准输入的概念。您在上面提到的getchar()函数只是从标准输入流中读取。尽管键盘是一种常见的输入方法,但C没有键盘的概念。键盘与C程序中的标准输入之间通常会有几层抽象层。执行此操作的机制是实现定义,而不是C的一部分。您提到了ASCII,但C不需要ASCII,尽管它非常常见。
有些图书馆尝试提供便携式键盘输入设施,例如SDL和curses。
另请参阅有关系统依赖性的comp.lang.c FAQ,尤其是19.5。
答案 1 :(得分:2)
以下是Windows Virtual-Key Codes - 您的程序使用GetMessage获取它们。
答案 2 :(得分:0)
//Here is a program to save a graphical o/p to bmp
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
int SaveBMP16(char []);
typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long dword;
void main()
{
/* request auto detection */
int gdriver;
int gmode, errorcode;
detectgraph(&gdriver,&gmode);
/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
errorcode = graphresult();
if (errorcode != grOk) /* an error occurred */
exit(1);
int midx, midy,radius = 100;
midx = getmaxx() / 2;
midy = getmaxy() / 2;
setcolor(getmaxcolor());
/* draw the circle */
circle(midx, midy, radius);
/* clean up */
SaveBMP16("Circle.Bmp");
}
struct BMP
{
// BitMap File Header
byte bfType[2]; /* 1 2 must always be set to 'BM' to declare that this is a .bmp file.*/
dword bfSize; /* 3 4 specifies the size of the file in bytes.*/
word bfReserved1;// 7 2 must always set to zero. */
word bfReserved2;// 9 2 must always be set to zero.
dword bfOffset; // 11 4 specifies the offset from the beginning of the file to bitmap data.
// BitMap Image Header
dword biSize; // 15 4 specifies the size of the BitMap Header structure, in bytes.
dword biWidth; // 19 4 specifies the width of image, in pixels.
dword biHeight; // 23 4 specifies the height of image, in pixels.
word biPlanes; // 27 2 specifies the number of planes of the target device,must be set to 0
word biBitCount; // 29 2 specifies the number of bits per pixel.
dword biCompression; //31 4 Specifies the type of compression, usually set to 0 - No Compres
dword biSizeImage; // 35 4 specifies the size of the image data, in bytes. If there is no compression, it is valid to set this member to zero.
dword biXPelsPerMeter; //39 4 specifies the the horizontal pixels per meter on the designated targer device, usually set to zero.
dword biYPelsPerMeter; // 43 4 specifies the the vertical pixels per meter on the designated targer device, usually set to zero
dword biClrUsed; // 47 4 specifies the number of colors used in bitmap, if set to 0 number of colors is calculated using the biBitCount member.
dword biClrImportant; // 51 4 specifies the number of color that are 'important' for the bitmap, if set to zero, all colors are important.
};
int SaveBMP16(char file[])
{
int i=0, j=0, r, g, b;
FILE *fp;
BMP *bmp;
bmp=(BMP *)malloc(54);
bmp->bfType[0]='B';
bmp->bfType[1]='M';
bmp->bfSize=153718;
bmp->bfReserved1=0;
bmp->bfReserved2=0;
bmp->bfOffset=118;
bmp->biSize=40;
bmp->biWidth=640;
bmp->biHeight=480;
bmp->biPlanes=1;
bmp->biBitCount=4;
bmp->biCompression=0;
bmp->biSizeImage=153600; //Fixed Size ?
bmp->biXPelsPerMeter=0;
bmp->biYPelsPerMeter=0;
bmp->biClrUsed=0;
bmp->biClrImportant=0;
fp=fopen(file, "wb");
if(fp == NULL)
{
printf("File can't be open");
getch();
return 1;
}
fwrite(bmp, 54, 1, fp);
fseek(fp, 54L, SEEK_SET);
// Upto Here its OK.
// Question 1. What do next 16x4 Lines do ?
fputc(0x0, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(127, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(127, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(127, fp);
fputc(127, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(127, fp);
fputc(0x0, fp);
fputc(127, fp);
fputc(0x0, fp);
fputc(127, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(192, fp);
fputc(192, fp);
fputc(0x0, fp);
fputc(192, fp);
fputc(192, fp);
fputc(192, fp);
fputc(0x0, fp);
fputc(128, fp);
fputc(128, fp);
fputc(128, fp);
fputc(0x0, fp);
fputc(255, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(255, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(255, fp);
fputc(255, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(255, fp);
fputc(0x0, fp);
fputc(255, fp);
fputc(0x0, fp);
fputc(255, fp);
fputc(0x0, fp);
fputc(0x0, fp);
fputc(255, fp);
fputc(255, fp);
fputc(0x0, fp);
fputc(255, fp);
fputc(255, fp);
fputc(255, fp);
fputc(0x0, fp);
i=0;
j=479;
fseek(fp, 118, SEEK_SET);
while(j>=0)
{
i=0;
while(i<640)
{
fputc((getpixel(i, j)<<4) | getpixel(i+1, j), fp); //Que 2. What does this do ? Why Left Shift 4 times and why Bit wise ORing of two pixles.
i+=2;
}
j--;
}
free(bmp);
fclose(fp);
return 0;
}