2011-06-10 7 views
2

В следующем коде я хочу, чтобы указатель мыши находился на экране, но везде, где я перемещаю курсор, я получаю тот же результат из второй выделенной или полужирной (не уверенной) части ниже (где курсор): -1957298293 343277548. Если у кого-то есть лучший способ получить позицию курсора или исправление для моего кода, пожалуйста, помогите. (Просто, кстати, «HANDLE csbiHandle; CONSOLE_SCREEN_BUFFER_INFO CSBI;» не нужны они были использованы в моем предыдущем методе, который также не удалось.)Cursor Position C++ Метод GetCursorPos

#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; 
} 

ответ

1

вы передаете неинициализированный указатель на 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; 
} 
+0

Хорошо спасибо. Оба эти метода имеют смысл и работают. Я просто пойду первым, потому что это быстрее. – someguy

4

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

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

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