光标位置 c++ GetCursorPos 方法

6
在下面的代码中,我想要获取鼠标光标在屏幕上的位置,但无论我将光标移动到哪里,我都会从下面第二个加粗的部分得到相同的输出(无论光标在哪里):-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个回答

11

你很幸运,程序没有立即崩溃。 GetCursorPos 函数需要一个 LPPOINT 作为参数,但这并不意味着你应该声明一个该类型的变量。相反,你应该这样做:

POINT point;
if (GetCursorPos(&point)) {
  cout << point.x << "," << point.y << "\n";
}
原因是在函数调用时,您的LPPOINT指针指向“某个地方”,而没有人知道它指向何处。这可能意味着它指向只读内存,Windows会检查此情况,并不会向该内存写入内容,而是返回FALSE。您未检查函数调用的返回值,因此无法确定它是否成功。

3
您正在将未初始化的指针传递给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;
}

好的,谢谢。这两种方法都很合理并且可行。我会选择第一种因为它更快。 - someguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接