#c #winapi #cursor #position
#c #winapi #положение #курсор мыши
Вопрос:
В следующем коде мне нужно указать положение курсора мыши на экране, но куда бы я ни перемещал курсор, я получаю тот же вывод из второй выделенной звездочкой или жирным шрифтом (не уверен) части ниже (где бы ни находился курсор): -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, amp;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("unknownn");
break;}
}
}
}
return 0;
}
Ответ №1:
Вам может повезти, что ваша программа не вылетела сразу. GetCursorPos
Функция получает LPPOINT
параметр as, но это не означает, что вы должны объявлять переменную этого типа. Вместо этого вы должны сделать это:
POINT point;
if (GetCursorPos(amp;point)) {
cout << point.x << "," << point.y << "n";
}
Причина в том, что ваша LPPOINT во время вызова является указателем, который указывает «куда-то», и никто не может сказать, куда он указывает. Так что вполне может быть, что это указывает на память, доступную только для чтения, и Windows так приятно проверять это и не записывать в эту память, а вместо этого возвращает FALSE
. Вы не проверили возвращаемое значение вызова функции, поэтому не можете знать, было ли оно успешным или нет.
Ответ №2:
вы передаете неинициализированный указатель на метод GetCursorPos(). Это классический случай неопределенного поведения. Обычно это приводит к сбою, но в вашем случае это что-то другое. Непонятно, почему вы все время читаете там одно и то же значение: самое главное, что это не должно быть сделано таким образом.
Правильный способ — передать действительный указатель в эту функцию. Это может быть сделано либо путем передачи указателя на локальную или глобальную ТОЧЕЧНУЮ переменную, либо путем выделения ТОЧЕЧНОЙ переменной в куче.
Вот пример правильной локальной переменной:
POINT cursor;
GetCursorPos(amp;cursor);
// examine (cursor) position here
и вот случай переменной, выделенной из кучи:
LPPOINT pCursor = new POINT;
if (pCursor != NULL) {
GetCursorPos(pCursor);
// examine and handle (*pCursor) position here
delete pCursor;
}
Комментарии:
1. Хорошо, спасибо. Оба этих метода имеют смысл и работают. Я просто выберу первый, потому что так быстрее.