我将引用此答案:Get current cursor position
工作代码:
HWND hwnd;
POINT p;
if (GetCursorPos(&p))
{
//cursor position now in p.x and p.y
}
if (ScreenToClient(hwnd, &p))
{
//p.x and p.y are now relative to hwnd's client area
cout << p.x << p.y;
}
当我点击窗口时,这会编译但崩溃:
HWND hwnd;
POINT p;
if (GetCursorPos(&p) && ScreenToClient(hwnd, &p))
{
//cursor position now in p.x and p.y
cout << p.x << p.y;
}
当我点击窗口时,这也会编译但崩溃:
HWND hwnd;
POINT p;
GetCursorPos(&p);
if (ScreenToClient(hwnd, &p))
{
//cursor position now in p.x and p.y
cout << p.x << p.y;
}
为什么呢?这些功能在任何方面都不寻常吗?
是否与涉及指针的事实有关?
如何在if
语句中放置这些函数会改变它们的运行方式?
答案 0 :(得分:4)
它不会改变函数的运行方式。许多函数返回一个布尔值,指示操作是否成功。通过将函数调用包含在if中,您将自动检查操作是否成功。
if(functionReturningSuccess(params))
{
//assume the operation succeeded
}
else
{
//report error
}
答案 1 :(得分:3)
if (GetCursorPos(&p) && ScreenToClient(hwnd, &p))
非常有害,但非常优雅。
由于&&
运算符的短路性质,只有在ScreenToClient(hwnd, &p)
成功运行时才会调用GetCursorPos(&p)
(即返回转换为true
)。后者如果成功,也会将p
设置为对后续ScreenToClient
来电有效的内容。
仅当两个功能都成功时才会运行封闭的if
块。
您的崩溃很可能是因为hwnd
未被初始化。