比如我想按Ctrl键与其他键的某个组合(或者可能是Alt键)来做一些事情。然后从标准input中如何读取C程序中的这个组合键作为input。
我试着用简单的getchar()
来知道这些组合的ASCII值。 但是对于一些关键组合来说,这是1比25和其他一些值。 有没有标准的库函数来读取它们? 不要问我为什么要这样做。
编辑 :我的平台是Windows上的Turbo C。
简短的回答:以特定于平台的方式。
长的答案:C的输入/输出概念是流标准输出和标准输入的概念。 上面提到的getchar()函数只是从标准输入流中读取数据。 C没有任何键盘的概念,尽管键盘是一种常用的输入法。 在你的键盘和C程序中的标准输入之间通常有几层抽象。 这样做的机制是实现定义的,而不是C的一部分。 你提到了ASCII,但是C不需要ASCII,尽管它非常常见。
一些图书馆试图提供便携式键盘输入设施,如SDL和curses 。
另请参阅关于系统依赖性的comp.lang.c常见问题 ,特别是19.5。
这里是Windows 虚拟键码 – 你的程序通过GetMessage获取它们。
//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; }