Может ли программа на С получить указатель мыши в консоли Windows? - PullRequest
0 голосов
/ 23 мая 2018

Были вопросы и ответы, касающиеся ввода с помощью мыши, но ввод с помощью мыши, похоже, не решает эту проблему.

Допустим, слово «стул» напечатано на консоли.Есть ли способ узнать, над какой мышью ('c', 'h', 'a', 'i', 'r' или none) мышь наводится?

Мне действительно не нужна функция, чтобыпостоянно обновлять себя, мне нужно выучить символ только один раз (например, когда пользователь нажимает кнопку).

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вероятно, самое простое, что нужно сделать, это отслеживать движение мыши с помощью ReadConsoleInput, которая даст вам координаты буфера экрана консоли указателя мыши, а затем получить символ с помощью ReadConsoleOutputCharacter, что-то вроде:

INPUT_RECORD irInBuf[128];
DWORD cNumRead;
int i;
COORD coord;

while (1)
{
    ReadConsoleInput(
        GetStdHandle(STD_INPUT_HANDLE),      // input buffer handle 
        irInBuf,     // buffer to read into 
        128,         // size of read buffer 
        &cNumRead);
    for (i = 0; i < cNumRead; i++)
    {
        if (irInBuf[i].EventType == MOUSE_EVENT)
        {
            MOUSE_EVENT_RECORD mer = irInBuf[i].Event.MouseEvent;
            switch (mer.dwEventFlags)
            {
            case 0:

                if (mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
                {
                    TCHAR c[2] = { '\0' };
                    DWORD cnum;
                    ReadConsoleOutputCharacter(
                        GetStdHandle(STD_OUTPUT_HANDLE),
                        c,
                        1,
                        coord,
                        &cnum
                        );
                    if (cnum == 1) MessageBox(NULL, c, NULL, 0);
                }
                break;
            case MOUSE_MOVED:
                //printf("mouse moved\n");
                coord.X = mer.dwMousePosition.X;
                coord.Y = mer.dwMousePosition.Y;
                break;
            default:
                break;
            }
        }
        else if (irInBuf[i].EventType == KEY_EVENT)
        {
            KEY_EVENT_RECORD ker = irInBuf[i].Event.KeyEvent;
            if (ker.bKeyDown)
            {
                DWORD written;
                WriteConsole(
                    GetStdHandle(STD_OUTPUT_HANDLE),
                    &ker.uChar,
                    1,
                    &written,
                    NULL
                    );
            }
        }
    }
}
0 голосов
/ 24 мая 2018

Функция GetConsoleScreenBufferInfo консольного API приблизит вас к тому, что вы можете получить (я думаю), но с дополнительными шагами: https://docs.microsoft.com/en-us/windows/console/getconsolescreenbufferinfo

Как видите, она возвращаетCONSOLE_SCREEN_BUFFER_INFO структура, которая содержит не только позицию курсора (dwCursorPosition), но и позиции символов (wAttributes).

Недостатком является то, что это может быть сделано только в экранном буфере, гдепользователь может перемещать курсор так же, как он взаимодействует с cmd при написании команды (со стрелками влево и вправо, при щелчке и т. д.).

Так что да, я не думаю, что выможет обнаружить мышь, но с помощью экранного буфера пользователь может нажимать на символы или перемещаться по ним и знать об этой позиции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...