private bool IsDoubleClick(MouseEventInformation info) { return (info.Button == m_PreviousClickedButton && info.X == m_PreviousClickedX && info.Y == m_PreviousClickedY && info.Timestamp - m_PreviousClickedTime <= m_SystemDoubleClickTime); }
private void HookMouseCallback(HookData hookData) { MouseEventInformation info = MouseEventInformation.Get(hookData); int mx = info.X; int my = info.Y; MouseButtons button = info.Button; // 마우스 다운 if (info.IsMouseDown) { if (IsDoubleClick(info)) { info = info.ToDobuleClickMouseEventInformation(); } OnMouseDown?.Invoke(mx, my, button); if (info.Clicks == 2) { m_DoubleButton |= info.Button; } if (info.Clicks == 1) { m_SingleButton |= button; } } // 마우스 업 if (info.IsMouseUp) { OnMouseUp?.Invoke(mx, my, button); // 마우스 클릭 if ((m_SingleButton & button) != MouseButtons.None) { OnMouseClick?.Invoke(mx, my, button); m_SingleButton &= ~button; } // 마우스 더블 클릭 if ((m_DoubleButton & button) != MouseButtons.None) { OnMouseDoubleClick?.Invoke(mx, my, button); m_DoubleButton &= ~button; } if (info.Clicks == 2) { m_PreviousClickedButton = MouseButtons.None; m_PreviousClickedTime = 0; m_PreviousClickedX = m_DefaultPositionXY; m_PreviousClickedY = m_DefaultPositionXY; } if (info.Clicks == 1) { m_PreviousClickedButton = info.Button; m_PreviousClickedTime = info.Timestamp; m_PreviousClickedX = mx; m_PreviousClickedY = my; } } // 마우스 스크롤 if (info.IsMouseWheelScrolled) { OnMouseWheel?.Invoke(mx, my, button, info.Delta > 0 ? 1 : -1); } // 마우스 이동 if (IsMoved(mx, my)) { m_PreviousX = mx; m_PreviousY = my; OnMouseMove?.Invoke(mx, my, button); } // 마우스 드래그 if ((m_SingleButton & MouseButtons.Left) != MouseButtons.None) { if (m_DragStartPositionX == m_DefaultPositionXY && m_DragStartPositionY == m_DefaultPositionXY) { m_DragStartPositionX = mx; m_DragStartPositionY = my; } // 마우스 드래그 스타트 if (m_dragMode == false) { bool isXDragging = Math.Abs(mx - m_DragStartPositionX) > m_SystemDragX; bool isYDragging = Math.Abs(my - m_DragStartPositionY) > m_SystemDragY; m_dragMode = isXDragging || isYDragging; if (m_dragMode == true) { OnMouseDragStart?.Invoke(mx, my, button); } } } else { m_DragStartPositionX = m_DefaultPositionXY; m_DragStartPositionY = m_DefaultPositionXY; // 마우스 드래그 엔드 if (m_dragMode == true) { OnMouseDragEnd?.Invoke(mx, my, button); m_dragMode = false; } } }