2011-06-08 99 views
6

如何在Windows控制檯程序中獲取C++中的鼠標點擊位置? (單擊時返回鼠標位置的變量)如何獲取控制檯程序中的鼠標位置?

我想用簡單的文本命令畫一個菜單,所以當有人點擊時,遊戲會註冊它並知道位置。我知道如何做我需要做的一切,除非點擊鼠標時獲得鼠標位置。

+1

你在一個控制檯應用程序的意思,或者你真的是DOS操作系統? – 2011-06-08 21:08:21

+0

只是一個控制檯應用程序。對不起,我沒有澄清 – someguy 2011-06-08 21:09:25

+0

控制檯在哪個操作系統?在Windows/Linux的/ MacOS的? – 2011-06-08 21:11:09

回答

10

您需要使用*ConsoleInput方法系列(peek,read等)。這些操作在控制檯的輸入緩衝區中,其中includes keyboard and mouse events。一般的策略是:在控制檯上的輸入緩衝區句柄(ReadConsoleInput

    1. 等待確定等待事件的
    2. 數( lpNumberOfEventsRead
    3. 處理它們,你認爲合適(即MOUSE_EVENTMOUSE_EVENT_RECORD

    您必須註明您要retrieve mouse input using SetConsoleMode first though, as illustrated in this MSDN article

  • +1

    ^^這個答案值得更多Upvotes – BlackDivine 2011-11-28 17:49:52

    0

    GetConsoleScreenBufferInfo檢索有關CONSOLE_SCREEN_BUFFER_INFO結構中指定控制檯屏幕緩衝區的信息。 dwCursorPosition會員爲您提供XY職位。

    +0

    好的。這就是我需要的。所以它是一個常數,或者我需要包括一些庫在MSDN中閱讀規格 – someguy 2011-06-08 21:13:12

    +0

    。所有你需要包括的是Windows.h – 2011-06-08 21:14:30

    +0

    而且是「dwCursorPosition」函數,我給它的地址。或者它在哪裏存儲x和y的位置 – someguy 2011-06-08 21:14:53

    0

    enter image description here

    使用控制檯自己的事件處理程序,鍵盤和鼠標 - ReadConsoleInput()

    EAD更多在這裏https://msdn.microsoft.com/en-us/library/windows/desktop/ms685035(v=vs.85).aspx

    #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); 
    
    
         } 
    
        } 
    
    } 
    
    
    //*****************************************************************************