2016-03-04 192 views
1

我嘗試了很多關於搜索獲取鼠標的x和y位置 在C的窗口控制檯中單擊,但我無法找到所以我 張貼在這裏。如何找到鼠標按鈕'點擊'位置x和y?

我正在創建我自己的文本編輯器項目(爲了好玩),我必須集成一個功能,只要我點擊控制檯內的光標就會移動到它(點擊x,y) 我不想知道如何移動光標但我想知道如何獲取點擊位置

This is what i have done till yet

這個代碼可以接收所有的鼠標和鍵盤和鼠標事件,甚至鼠標點擊:

#include <windows.h> 
#include <stdio.h> 

HANDLE hStdin; 
DWORD fdwSaveOldMode; 

VOID ErrorExit(LPSTR); 
VOID KeyEventProc(KEY_EVENT_RECORD); 
VOID MouseEventProc(MOUSE_EVENT_RECORD); 
VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD); 

int main(VOID) 
{ 
    DWORD cNumRead, fdwMode, i; 
    INPUT_RECORD irInBuf[128]; 
    int counter=0; 

    // Get the standard input handle. 

    hStdin = GetStdHandle(STD_INPUT_HANDLE); 
    if (hStdin == INVALID_HANDLE_VALUE) 
     ErrorExit("GetStdHandle"); 

    // Save the current input mode, to be restored on exit. 

    if (! GetConsoleMode(hStdin, &fdwSaveOldMode)) 
     ErrorExit("GetConsoleMode"); 

    // Enable the window and mouse input events. 

    fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT; 
    if (! SetConsoleMode(hStdin, fdwMode)) 
     ErrorExit("SetConsoleMode"); 

    // Loop to read and handle the next 100 input events. 

    while (counter++ <= 100) 
    { 
     // Wait for the events. 

     if (! ReadConsoleInput(
       hStdin,  // input buffer handle 
       irInBuf,  // buffer to read into 
       128,   // size of read buffer 
       &cNumRead)) // number of records read 
      ErrorExit("ReadConsoleInput"); 

     // Dispatch the events to the appropriate handler. 

     for (i = 0; i < cNumRead; i++) 
     { 
      switch(irInBuf[i].EventType) 
      { 
       case KEY_EVENT: // keyboard input 
        KeyEventProc(irInBuf[i].Event.KeyEvent); 
        break; 

       case MOUSE_EVENT: // mouse input 
        MouseEventProc(irInBuf[i].Event.MouseEvent); 
        break; 

       case WINDOW_BUFFER_SIZE_EVENT: // scrn buf. resizing 
        ResizeEventProc(irInBuf[i].Event.WindowBufferSizeEvent); 
        break; 

       case FOCUS_EVENT: // disregard focus events 

       case MENU_EVENT: // disregard menu events 
        break; 

       default: 
        ErrorExit("Unknown event type"); 
        break; 
      } 
     } 
    } 

    // Restore input mode on exit. 

    SetConsoleMode(hStdin, fdwSaveOldMode); 

    return 0; 
} 
VOID ErrorExit (LPSTR lpszMessage) 
{ 
    fprintf(stderr, "%s\n", lpszMessage); 

    // Restore input mode on exit. 

    SetConsoleMode(hStdin, fdwSaveOldMode); 

    ExitProcess(0); 
} 

VOID KeyEventProc(KEY_EVENT_RECORD ker) 
{ 
    printf("Key event: "); 
    if(ker.bKeyDown) 
     printf("key pressed\n"); 
    else printf("key released\n"); 
} 
VOID MouseEventProc(MOUSE_EVENT_RECORD mer) 
{ 
    #ifndef MOUSE_HWHEELED 
    #define MOUSE_HWHEELED 0x0008 
    #endif 
    printf("Mouse event: "); 

    switch(mer.dwEventFlags) 
    { 
     case 0: 

      if(mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) 
      { 
       printf("left button press \n"); 
      } 
      else if(mer.dwButtonState == RIGHTMOST_BUTTON_PRESSED) 
      { 
       printf("right button press \n"); 
      } 
      else 
      { 
       printf("button press\n"); 
      } 
      break; 
     case DOUBLE_CLICK: 
      printf("double click\n"); 
      break; 
     case MOUSE_HWHEELED: 
      printf("horizontal mouse wheel\n"); 
      break; 
     case MOUSE_MOVED: 
      printf("mouse moved\n"); 
      break; 
     case MOUSE_WHEELED: 
      printf("vertical mouse wheel\n"); 
      break; 
     default: 
      printf("unknown\n"); 
      break; 
    } 
} 
VOID ResizeEventProc(WINDOW_BUFFER_SIZE_RECORD wbsr) 
{ 
    printf("Resize event\n"); 
    printf("Console screen buffer is %d columns by %d rows.\n", wbsr.dwSize.X, wbsr.dwSize.Y); 
} 

我聽說不能用C來完成,但如果當我們的鼠標鼠標持續移動時的位置,我相信我們可能會得到點擊位置。但我不知道如何。

+6

請選擇C或C++。沒有相同的語言 – Garf365

+0

Al-right,我選擇C –

+0

http://stackoverflow.com/a/6423739/2681245這可能有助於 – Rocoder

回答

1

例如獲取位置信息在用戶雙擊您要更換:

printf("double click\n"); 

由:

printf("double clicked at x=%d, y=%d\n", mer.dwMousePosition.X, mer.dwMousePosition.Y); 
+0

非常感謝兄弟幫忙! –

+0

@AhmadTaha當您滿意答案時,請務必將其標記爲已接受。 – a3f

相關問題