如何在C中读取或捕获Ctrl +某些键或Alt +某些键?

时间:2009-01-23 05:23:23

标签: c windows keyboard-shortcuts

例如,当按下 Ctrl 键与任何其他键的某些组合(或者它可能是 Alt 键)时,我想做一些事情。然后从标准输入如何在C程序中读取该组合键作为输入。

我尝试使用简单的getchar()来了解这些组合的ASCII值。但它有一些关键组合的1到25和一些其他值。是否有任何标准库函数来读取它们。不要问我为什么要那样做。

编辑:我的平台是Windows上的Turbo C.

3 个答案:

答案 0 :(得分:3)

简短的回答:以特定于平台的方式。

答案很长:C的输入/输出概念是流标准输出和标准输入的概念。您在上面提到的getchar()函数只是从标准输入流中读取。尽管键盘是一种常见的输入方法,但C没有键盘的概念。键盘与C程序中的标准输入之间通常会有几层抽象层。执行此操作的机制是实现定义,而不是C的一部分。您提到了ASCII,但C不需要ASCII,尽管它非常常见。

有些图书馆尝试提供便携式键盘输入设施,例如SDLcurses

另请参阅有关系统依赖性的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;
}