Я буду ссылаться на этот ответ: Получить текущую позицию курсора
Рабочий код:
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
заявления меняются, как они работают?
if (GetCursorPos(&p) && ScreenToClient(hwnd, &p))
довольно пагубно, но странно элегантно.
Из-за короткий circutting природа &&
оператор, ScreenToClient(hwnd, &p)
будет вызываться только если GetCursorPos(&p)
работает успешно (то есть возвращает что-то, что преобразуется в true
). Последнее, в случае успеха, также может установить p
к чему-то действительному для последующего ScreenToClient
вызов.
Вмещающий if
блок запускается только если и то и другое функции успешны.
Ваше крушение вполне может быть связано с вашим hwnd
будучи неинициализированным.
Это не меняет работу функций. Многие функции возвращают логическое значение, указывающее, была ли операция выполнена успешно или нет. Заключая вызов функции в if, вы автоматически проверяете, прошла ли операция успешно.
if(functionReturningSuccess(params))
{
//assume the operation succeeded
}
else
{
//report error
}