Как прочитать внешний вид мыши (указатель, изменение размера и т.д.) в Win32

#winapi #mouse

#winapi #мышь

Вопрос:

Есть ли способ измерить, отображается ли текущее изображение мыши, что оно находится в режиме изменения размера?

Я создаю горизонтальный слайдер, который является просто подклассом static (label). Когда пользователь наводит курсор мыши на ползунок (статический элемент управления) и нажимает и удерживает левую кнопку мыши нажатой (wm_lbuttondown) Я вызываю функцию setcapture окна. Затем я вызываю releasecapture, когда пользователь отпускает кнопку мыши (wm_lbuttonup). Моя подклассовая процедура статического управления называется onevent_label . WndProc обрабатывает сообщения для всего остального.

Ползунок работает хорошо, за исключением случаев, когда вы завершаете один слайд, а затем сразу щелкаете мышью, чтобы запустить 2-й слайд, без предварительного перемещения мыши в другую область или щелчка мышью по другому элементу управления.

Я определил, что проблема вызвана тем, что 2-й щелчок, событие wm_lbuttondown, запускается в wndproc (не onevent_label). Изображение мыши, похоже, все время находится в режиме изменения размера, однако я измеряю положение мыши в процедуре wm_lbuttondown в wndproc и вижу, что оно находится на один пиксель слева от моего статического элемента управления label, ползунка.

Простое решение — просто отправить сообщение wm_lbuttondown статическому элементу управления, однако я хотел бы сделать процедуру wm_lbuttondown wndproc разумной и пересылать сообщение только при необходимости.

Я решил, что лучший способ сделать это — проверить, по-прежнему ли Windows отображает, что мышь находится в режиме изменения размера, и что положение курсора достаточно близко к статической метке.

Кажется, я не могу найти способ измерить, является ли изображение мыши указателем (обычный случай) или показывает, что он хочет изменить размер элемента управления (стрелки вправо и влево по горизонтали).

План B состоит в том, Чтобы пересылать сообщение только в том случае, если положение мыши находится в пределах одного или двух пикселей от ползунка. В идеальном мире я хотел бы знать, что мышь отображает изображение с горизонтальным изменением размера и находится в пределах одного или двух пикселей от ползунка.

Мысли? Комментарии? Есть ли у меня способ определить, отображает ли мышь изображение с горизонтальным изменением размера?

Заранее спасибо.

Комментарии:

1.Кто устанавливает режим отображения изображения мыши resize ? Если это было за границей окна, кто-то другой мог захватить мышь в этот момент. Вы можете проверить это с помощью GetCapture learn.microsoft.com/en-us/windows/win32/api/winuser /…

2. Я понял, что создал эту проблему для себя, не сбросив курсор (на IDC_ARROW) после того, как закончил его использовать. К вашему сведению, другие, которые натыкаются на этот вопрос: я использовал gcl_hcursor и idc_sizewe для изменения размера курсора по горизонтали и пренебрег использованием gcl_hcursor и idc_arrow для сброса. Для вертикального ползунка используйте idc_sizens и сбросьте значение idc_arrow .

Ответ №1:

Re: Is there a way for me to determine if the mouse is displaying its horizontal resize image? — вот как вы можете это сделать:

 HCURSOR h = LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE));
CURSORINFO ci = {sizeof CURSORINFO };
GetCursorInfo(amp;ci);
  

и сравните h с ci.hCursor . Здесь перечислены все стандартные курсоры: https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadcursora