如何在控制台程序中获取鼠标位置? 如何在Windows控制台程序中获得C++中鼠标点击位置?(单击时返回鼠标位置的变量)

如何在控制台程序中获取鼠标位置? 如何在Windows控制台程序中获得C++中鼠标点击位置?(单击时返回鼠标位置的变量),c++,mouse,windows-console,C++,Mouse,Windows Console,我想用简单的文本命令画一个菜单,这样当有人点击时,游戏就会注册它并知道位置。我知道如何做我需要做的一切,除了在单击时获取鼠标位置。在控制台屏幕缓冲区信息结构中检索有关指定控制台屏幕缓冲区的信息。dwCursorPosition成员为您提供X和Y位置。您需要使用一系列方法(peek、read等)。这些操作在控制台的输入缓冲区上进行,该缓冲区。总的战略是: 等待控制台的输入缓冲区句柄() 确定等待事件的数量(lpNumberOfEventsRead) 按您认为合适的方式处理它们(即鼠标事件和) 你必

我想用简单的文本命令画一个菜单,这样当有人点击时,游戏就会注册它并知道位置。我知道如何做我需要做的一切,除了在单击时获取鼠标位置。

控制台屏幕缓冲区信息
结构中检索有关指定控制台屏幕缓冲区的信息。
dwCursorPosition
成员为您提供
X
Y
位置。

您需要使用一系列方法(peek、read等)。这些操作在控制台的输入缓冲区上进行,该缓冲区。总的战略是:

  • 等待控制台的输入缓冲区句柄()
  • 确定等待事件的数量(
    lpNumberOfEventsRead
  • 按您认为合适的方式处理它们(即
    鼠标事件
    和)
  • 你必须表明你想这样做。

    将控制台自己的事件处理程序用于键盘和鼠标-
    ReadConsoleInput()

    这里有更多

    #包括
    #包括
    #包括
    使用名称空间std;
    void gotoxy(int x,int y);
    void setcolor(单词颜色);
    void setforegroundbackgroundcolor(int-ForeGroundColor,int-BackGroundColor);
    void();
    void drawpixel(无符号字符x、无符号字符y、无符号字符颜色);
    void drawpixel2(无符号字符x、无符号字符y、无符号字符颜色、字符字符);
    虚空画圈(整数x,整数y,整数a,整数b,整数颜色);
    虚线(整数x0、整数y0、整数x1、整数y1、整数颜色);
    void drawfilledrectangle(无符号字符x1、无符号字符y1、无符号字符x2、无符号字符y2、无符号字符bkcol);
    无效绘图框(无符号x、无符号y、无符号sx、无符号sy、无符号字符col、无符号字符col2、字符文本_[]);
    void drawwindow(无符号x、无符号y、无符号sx、无符号sy、无符号字符col、无符号字符col2、无符号字符bkcol、字符文本_[]);
    int main()
    {
    gotoxy(1,23);
    setcolor(7);
    清除屏幕();
    
    Coudo:你指的是控制台应用程序,或者你真的是指DOS操作系统?只是控制台应用程序。对不起,我没有在控制台中操作操作系统。Windows/Linux/MACOS?Windows操作系统。只是控制台在DOS窗口中附加一个普通的C++控制台应用程序。我可以画一个按钮,知道坐标,但我需要返回的东西。“鼠标点击位置”好的。这就是我需要的。它是一个常量还是我需要包括一些库阅读MSDN中的规范。你需要包括的只是Windows.hAnd是“dwCursorPosition”“我给它地址的函数,或者它存储X和Y位置的位置,我如何判断是否有点击事件?你可以得到<代码>鼠标移动.<代码>事件,包括<代码> DWMouSePix< /Cord>。一个编译在GCC和Visual C++中的完整例子,不远!
    #include <iostream>
    #include <stdlib.h>
    #include <windows.h>
    using namespace std;
    
    void gotoxy(int x, int y);
    void setcolor(WORD color);
    void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor);
    void clearscreen();
    void drawpixel( unsigned char x, unsigned char y, unsigned char Color);
    void drawpixel2( unsigned char x, unsigned char y, unsigned char Color, char character);
    void drawcircle(int x, int y, int a, int b, int color);
    void drawline(int x0, int y0, int x1, int y1, int color);
    void drawfilledrectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol);
    void drawframe(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[]);
    void drawwindow(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,unsigned char bkcol,char text_[]);
    
    int main()
    {
        gotoxy(1,23);
        setcolor(7);
        clearscreen();
    
        cout<<"click anywhere in console window to write - hello world -\n\n\n\n\n\n\n\n\n\n\n\n\n"
        "Press Ctrl+C to Exit";
    
            HANDLE hout= GetStdHandle(STD_OUTPUT_HANDLE);
            HANDLE hin = GetStdHandle(STD_INPUT_HANDLE);
            INPUT_RECORD InputRecord;
            DWORD Events;
            COORD coord;
            CONSOLE_CURSOR_INFO cci;
            cci.dwSize = 25;
            cci.bVisible = FALSE;
            SetConsoleCursorInfo(hout, &cci);
            SetConsoleMode(hin, ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT);
            bool EXITGAME = false;
            int buttonX=1, buttonY=1;
    
            drawpixel(buttonX,buttonY ,1);
            gotoxy(buttonX+2,buttonY);
            setcolor(3);
            cout<<"<----- a button \n";
    
    
        while( !EXITGAME )
        {
    
            ReadConsoleInput(hin, &InputRecord, 1, &Events);
    
    
            switch ( InputRecord.EventType ){
                    case KEY_EVENT: // keyboard input 
    
    
                        switch (InputRecord.Event.KeyEvent.wVirtualKeyCode)
                        {
                            case VK_ESCAPE:
                               EXITGAME = TRUE;
                             break;
    
                            case VK_SPACE:
    
                             break;
    
    
                            case VK_RETURN:
    
                             break;
    
                            case VK_LEFT:
                                // left key   move player left
                                cout<<"VK_LEFT   = "<<InputRecord.Event.KeyEvent.wVirtualKeyCode <<" \n";
    
                             break;
    
                            case VK_RIGHT:
                                // right key   move player right
                                cout<<"VK_RIGHT   = "<<InputRecord.Event.KeyEvent.wVirtualKeyCode <<" \n";
    
                             break;
    
                            case VK_UP:
                                // up key   move player up
                                cout<<"VK_UP   = "<<InputRecord.Event.KeyEvent.wVirtualKeyCode <<" \n";
    
    
                             break;
    
                            case VK_DOWN:
                                // up key   move player down
                                cout<<"VK_DOWN   = "<<InputRecord.Event.KeyEvent.wVirtualKeyCode <<" \n";
    
    
                             break;
    
    
    
                        }//switch
    
                        //---------------------------------------------------------------------------------
                        break; 
    
                    case MOUSE_EVENT: // mouse input 
    
                        if(InputRecord.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
                        {
                            coord.X = InputRecord.Event.MouseEvent.dwMousePosition.X;
                            coord.Y = InputRecord.Event.MouseEvent.dwMousePosition.Y;
                            SetConsoleCursorPosition(hout,coord);
                            SetConsoleTextAttribute(hout,rand() %7+9);
    
                            if ( (InputRecord.Event.MouseEvent.dwMousePosition.X == buttonX ) && 
                                ( InputRecord.Event.MouseEvent.dwMousePosition.Y == buttonY) ){
    
                                clearscreen();
                                gotoxy(1,1);
                                setcolor(7);
                                drawpixel(buttonX,buttonY ,1);
                                setcolor(3);
                                cout<<" mybutton was pressed \n";
                                setcolor(7);
                                Sleep(500);
                                drawpixel(buttonX,buttonY ,1);
                                gotoxy(buttonX+2,buttonY);
                                setcolor(3);
                                cout<<"<----- a button      \n";
    
    
                            }
    
                            cout<<"Hello world at "<< InputRecord.Event.MouseEvent.dwMousePosition.X <<" x "<< InputRecord.Event.MouseEvent.dwMousePosition.Y<<" ";
    
                        }// mouse 
    
                        break; 
    
                    case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing 
                         ; 
                        break; 
    
                    case FOCUS_EVENT:  // disregard focus events 
    
                    case MENU_EVENT:   // disregard menu events 
    
                        break; 
    
                    default: 
                        cout<<"Unknown event type \n"; 
                        break; 
            }
    
    
    
            FlushConsoleInputBuffer(hin);
        }
        gotoxy(1,23);
        setcolor(7);
        clearscreen();
        cout<<"\n";
        return 0;
    
    }
    
    
    
    void gotoxy(int x, int y){
        COORD coord;
        coord.X = x; coord.Y = y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
        return;
    }
    
    //*****************************************************************************
    
    void setcolor(WORD color){
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
        return;
    }
    
    //*****************************************************************************
    
    
    //
    //     colors:
    //     0 = Black
    //     1 = Blue
    //     2 = Green
    //     3 = Cyan
    //     4 = Red
    //     5 = Magenta
    //     6 = Yellow
    //     7 = LightGray
    //     8 = DarkGray
    //     9 = LightBlue
    //     10 = LightGreen
    //     11 = LightCyan
    //     12 = LightRed
    //     13 = LightMagenta
    //     14 = LightYellow
    //     15 = White
    
    
    //
    
    //*****************************************************************************
    
    void setForeGroundAndBackGroundColor(int ForeGroundColor,int BackGroundColor){
       int color=16*BackGroundColor+ForeGroundColor;
       setcolor(color);
    }
    
    //*****************************************************************************
    
    void clearscreen(){
        COORD coordScreen = { 0, 0 };
        DWORD cCharsWritten;
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        DWORD dwConSize;
        HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    
        GetConsoleScreenBufferInfo(hConsole, &csbi);
        dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
        FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten);
        GetConsoleScreenBufferInfo(hConsole, &csbi);
        FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
        SetConsoleCursorPosition(hConsole, coordScreen);
        return;
    }
    
    //*****************************************************************************
    
    void drawpixel( unsigned char x, unsigned char y, unsigned char Color){
            setcolor(Color);
            gotoxy(x,y);printf("Û");
    }
    //*****************************************************************************
    
    void drawpixel2( unsigned char x, unsigned char y, unsigned char Color, char character){
            setcolor(Color);
            gotoxy(x,y);printf("%c",character);
    }
    
    //*****************************************************************************
    
    void drawcircle(int x, int y, int a, int b, int color){
        int wx, wy;
        int thresh;
        int asq = a * a;
        int bsq = b * b;
        int xa, ya;
    
        drawpixel(x, y+b, color);
        drawpixel(x, y-b, color);
    
        wx = 0;
        wy = b;
        xa = 0;
        ya = asq * 2 * b;
        thresh = asq / 4 - asq * b;
    
        for (;;) {
            thresh += xa + bsq;
    
            if (thresh >= 0) {
                ya -= asq * 2;
                thresh -= ya;
                wy--;
            }
    
            xa += bsq * 2;
            wx++;
    
            if (xa >= ya)
              break;
    
    
            drawpixel(x+wx, y-wy, color);
            drawpixel(x-wx, y-wy, color);
            drawpixel(x+wx, y+wy, color);
            drawpixel(x-wx, y+wy, color);
        }
    
        drawpixel(x+a, y, color);
        drawpixel(x-a, y, color);
    
        wx = a;
        wy = 0;
        xa = bsq * 2 * a;
    
        ya = 0;
        thresh = bsq / 4 - bsq * a;
    
        for (;;) {
            thresh += ya + asq;
    
            if (thresh >= 0) {
                xa -= bsq * 2;
                thresh = thresh - xa;
                wx--;
            }
    
            ya += asq * 2;
            wy++;
    
            if (ya > xa)
              break;
    
            drawpixel(x+wx, y-wy, color);
            drawpixel(x-wx, y-wy, color);
            drawpixel(x+wx, y+wy, color);
            drawpixel(x-wx, y+wy, color);
        }
    }
    
    //*****************************************************************************
    
    void drawline(int x0, int y0, int x1, int y1, int color){
        int pix = color;
        int dy = y1 - y0;
        int dx = x1 - x0;
        int stepx, stepy;
    
        if (dy < 0) { dy = -dy;  stepy = -1; } else { stepy = 1; }
        if (dx < 0) { dx = -dx;  stepx = -1; } else { stepx = 1; }
        dy <<= 1;                                                  // dy is now 2*dy
        dx <<= 1;                                                  // dx is now 2*dx
    
      drawpixel( x0, y0,pix);
        if (dx > dy) {
            int fraction = dy - (dx >> 1);                         // same as 2*dy - dx
            while (x0 != x1) {
                if (fraction >= 0) {
                    y0 += stepy;
                    fraction -= dx;                                // same as fraction -= 2*dx
                }
                x0 += stepx;
                fraction += dy;                                    // same as fraction -= 2*dy
                drawpixel( x0, y0,pix);
            }
        } else {
            int fraction = dx - (dy >> 1);
            while (y0 != y1) {
                if (fraction >= 0) {
                    x0 += stepx;
                    fraction -= dy;
                }
                y0 += stepy;
                fraction += dx;
                drawpixel( x0, y0,pix);
            }
        }
    }
    
    //*****************************************************************************
    
    
    void drawframe(unsigned x,unsigned y,unsigned sx,unsigned sy,unsigned char col,unsigned char col2,char text_[]){
        unsigned i,j,m;{
    
           m=(sx-x);                       //differential
           j=m/8;                          //adjust
           j=j-1;                          //more adjustment
           gotoxy(x,y);printf("É");       //Top left corner of drawframe
           gotoxy(sx,y);printf("»");      //Top right corner of drawframe
           gotoxy(x,sy);printf("È");      //Bottom left corner of drawframe
           gotoxy(sx,sy);printf("¼");     //Bottom right corner of drawframe
    
           for (i=x+1;i<sx;i++){
              gotoxy(i,y);printf("Í");     // Top horizontol line
              gotoxy(i,sy);printf("Í");    // Bottom Horizontal line
           }
    
           for (i=y+1;i<sy;i++){
              gotoxy(x,i);printf("º");     //Left Vertical line
              gotoxy(sx,i);printf("º");    //Right Vertical Line
           }
    
              gotoxy(x+j,y);printf(text_); //put Title
              gotoxy(1,24);
        }
    }
    
     //*****************************************************************************
    
    void drawfilledrectangle(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char bkcol){
        int x,y;
        setcolor(bkcol);                       //Set to color bkcol
    
        for (y=y1;y<y2;y++){                    //Fill Y Region Loop
            for (x=x1;x<x2;x++) {              //Fill X region Loop
              gotoxy(x,y);printf(" ");       //Draw Solid space
            }
        }
    }
    
    //*****************************************************************************
    
    void drawwindow(unsigned x,unsigned y,unsigned sx,unsigned sy,
             unsigned char col, unsigned char col2,unsigned char bkcol,char text_[]){
        drawfilledrectangle(x,y,sx,sy,bkcol);
        drawframe(x,y,sx,sy,col,col2,text_);
    }
    
    //*****************************************************************************
    
    
    void drawcolorpalette(){
        for (int i=0;i<16;i++){
            for (int j=0;j<16;j++){
                setForeGroundAndBackGroundColor(i,j);
                gotoxy(i*4,j);printf("%d",(i*j)+1);
    
    
            }
    
        }
    
    }
    
    
    //*****************************************************************************