Как прочитать или захватить Ctrl + некоторую клавишу или Alt + некоторую клавишу в C? - PullRequest
3 голосов
/ 23 января 2009

Например, я хочу сделать что-то, когда нажата какая-то комбинация клавиши Ctrl с любой другой клавишей (или это может быть Alt клавиша). Затем из стандартного ввода как читать эту комбинацию клавиш в C-программе как ввод.

Я пытался с помощью простого getchar() узнать значения ASCII этих комбинаций. Но это были от 1 до 25 и некоторые другие значения для некоторых комбинаций клавиш. Есть ли стандартная функция библиотеки для их чтения. Не спрашивайте меня, почему вы хотите это сделать.

Редактировать : Моя платформа - Turbo C в Windows.

Ответы [ 3 ]

3 голосов
/ 23 января 2009

Краткий ответ: в зависимости от платформы.

Длинный ответ: концепция ввода / вывода C - это стандартная выдача потоков и стандартная запись. Функция getchar (), которую вы упомянули выше, просто читает из стандартного потока ввода. C не имеет никакого представления о клавиатурах, несмотря на то, что клавиатуры являются обычным методом ввода. Обычно существует несколько уровней абстракции между клавиатурой и тем, что передается на стандартный ввод в вашей C-программе. Механизм для этого определяется реализацией, а не частью C вообще. Вы упомянули ASCII, но C не требует ASCII, несмотря на то, что он очень распространен.

Некоторые библиотеки пытаются предоставить портативные средства ввода с клавиатуры, такие как SDL и curses .

См. Также comp.lang.c FAQ о системных зависимостях, в частности 19.5.

2 голосов
/ 23 января 2009

Вот коды Windows Virtual-Key - ваша программа получает их с GetMessage .

0 голосов
/ 19 мая 2009
//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;
}
...