GetCursorPos的问题

the*_*G27 0 c++ windows directx winapi

我遇到了GetCursorPos的问题.我用directx画一个光标所在的方块,但我的代码不起作用,我不明白为什么......

LPPOINT cursorPos = 0;
GetCursorPos(cursorPos);
square->setPosition(D3DXVECTOR2(40.0f,60.0f));  // as a test: works fine...
square->setPosition(D3DXVECTOR2(cursorPos->x, cursorPos->y)); // -> crash
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

LPPOINT cursorPos = 0;
GetCursorPos(cursorPos);
float posX = cursorPos->x;  // no crash...
float posY = cursorPos->y;  // no crash...
std::cout << posX << posY <<std::endl; // CRASH!
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么??

tem*_*def 6

当您声明一个时LPPOINT,您将声明一个指向POINT对象的指针.因此,当你写

LPPOINT cursorPos = 0;
Run Code Online (Sandbox Code Playgroud)

您正在创建一个名为cursorPos并将其设置为的指针NULL.电话

GetCursorPos(cursorPos);
Run Code Online (Sandbox Code Playgroud)

然后失败,因为GetCursorPos希望你提供一个指向POINT你要用信息填写的NULL指针,并且你已经提供了一个指针.因此,当你写作

square->setPosition(D3DXVECTOR2(cursorPos->x, cursorPos->y)); // -> crash
Run Code Online (Sandbox Code Playgroud)

NULL在尝试阅读x和阅读时你正在读指针y.这会导致未定义的行为,这是一个崩溃.在另一种情况下,你也得到了未定义的行为,它恰好没有崩溃.

要解决此问题,请尝试声明一个实际POINT对象,如下所示:

POINT cursorPos;
Run Code Online (Sandbox Code Playgroud)

然后打电话

GetCursorPos(&cursorPos);
Run Code Online (Sandbox Code Playgroud)

然后把这个位置读作

square->setPosition(D3DXVECTOR2(cursorPos.x, cursorPos.y));
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!