Положение курсора c ++ метод GetCursorPos - PullRequest
2 голосов
/ 10 июня 2011

В следующем коде я хочу указать положение курсора мыши на экране, но, куда бы я ни перемещал курсор, я получаю одинаковые выходные данные от второй отмеченной звездочкой или жирной (не уверен) части ниже (где бы курсор ни находился) : -1957298293 343277548. Если у кого-то есть лучший способ получить положение курсора или исправить мой код, пожалуйста, помогите. (Кстати, «HANDLE csbiHandle; CONSOLE_SCREEN_BUFFER_INFO csbi;» не нужны. Они использовались в моем предыдущем методе, который также не удался)

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <cstdio>
#include <stdio.h>

#ifndef MOUSE_HWHEELED
#define MOUSE_HWHEELED 0x0008
#endif
using namespace std;

int main()
{
LPPOINT point;
HANDLE csbiHandle;
CONSOLE_SCREEN_BUFFER_INFO csbi;
int counter = 0;
DWORD cNumRead, i,fdwMode, fdwSaveOldMode;
INPUT_RECORD irInputBuffer[128];
HANDLE stdHandle;
stdHandle = GetStdHandle(STD_INPUT_HANDLE);
MOUSE_EVENT_RECORD mer;


cout << "|-------------|" << endl
     << "|      A      |" << endl
     << "|-------------|" << endl;
while(counter++<1000)
{
buttonpress:
ReadConsoleInput(stdHandle, irInputBuffer,128, &cNumRead);
**GetCursorPos(point);**
for(i=0; i<cNumRead; i++)
{
    switch(irInputBuffer[i].EventType)
    {
        case MOUSE_EVENT:
        {
            mer = irInputBuffer[i].Event.MouseEvent;

            if(mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
            {
                cout << "left button press" << endl;
                **cout << point->x << " " << point->y << endl;**
            }
            else
            {
                goto buttonpress;
            }
            break;
       }
        default:{
            printf("unknown\n");
            break;}
    }
}
}


return 0;
}

Ответы [ 2 ]

4 голосов
/ 10 июня 2011

Вам повезет, что ваша программа не сработала сразу. Функция GetCursorPos получает LPPOINT в качестве параметра, но это не значит, что вы должны объявлять переменную этого типа. Вместо этого вы должны сделать это:

POINT point;
if (GetCursorPos(&point)) {
  cout << point.x << "," << point.y << "\n";
}

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

1 голос
/ 10 июня 2011

вы передаете неинициализированный указатель методу GetCursorPos (). Это классический случай неопределенного поведения. Это обычно вызывает сбой, но в вашем случае это что-то другое. Невозможно сказать, почему вы все время читаете одно и то же значение: самое главное, что это нельзя делать таким образом.

Правильный способ - передать действительный указатель в эту функцию. Это можно сделать, передав указатель на локальную или глобальную переменную POINT или разместив переменную POINT в куче.

Вот случай правильной локальной переменной:

POINT cursor;
GetCursorPos(&cursor);
// examine (cursor) position here

и вот случай переменной, выделенной в куче:

LPPOINT pCursor = new POINT;
if (pCursor != NULL) {
    GetCursorPos(pCursor);
    // examine and handle (*pCursor) position here
    delete pCursor;
}
...