From 592282495033e794106d6e5fc893a947211b9c83 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Thu, 5 Mar 2026 02:57:52 +0800 Subject: [PATCH] fix: fix #464 --- .../UI/IUIScene_AbstractContainerMenu.cpp | 2 +- .../UI/UIScene_AbstractContainerMenu.cpp | 142 +++++++++++++++++- .../Common/UI/UIScene_AbstractContainerMenu.h | 6 + .../Windows64/KeyboardMouseInput.cpp | 2 +- 4 files changed, 148 insertions(+), 4 deletions(-) diff --git a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp index 88258421..a82e050a 100644 --- a/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/IUIScene_AbstractContainerMenu.cpp @@ -481,7 +481,7 @@ void IUIScene_AbstractContainerMenu::onMouseTick() #endif #ifdef _WINDOWS64 - if (!g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive()) + if (!g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive() && g_KBMInput.IsCursorHiddenForUI()) { int deltaX = g_KBMInput.GetMouseDeltaX(); int deltaY = g_KBMInput.GetMouseDeltaY(); diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp index 6b196c1b..66ee7dd1 100644 --- a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.cpp @@ -7,6 +7,8 @@ #include "..\..\MultiplayerLocalPlayer.h" #ifdef _WINDOWS64 #include "..\..\Windows64\KeyboardMouseInput.h" + +extern HWND g_hWnd; #endif UIScene_AbstractContainerMenu::UIScene_AbstractContainerMenu(int iPad, UILayer *parentLayer) : UIScene(iPad, parentLayer) @@ -28,6 +30,12 @@ UIScene_AbstractContainerMenu::UIScene_AbstractContainerMenu(int iPad, UILayer * ui.OverrideSFX(m_iPad,ACTION_MENU_DOWN,true); m_bIgnoreInput=false; +#ifdef _WINDOWS64 + m_bMouseDragSlider = false; + m_bHasMousePosition = false; + m_lastMouseX = 0; + m_lastMouseY = 0; +#endif } UIScene_AbstractContainerMenu::~UIScene_AbstractContainerMenu() @@ -84,8 +92,8 @@ void UIScene_AbstractContainerMenu::InitDataAssociations(int iPad, AbstractConta void UIScene_AbstractContainerMenu::PlatformInitialize(int iPad, int startIndex) { #ifdef _WINDOWS64 - g_KBMInput.SetScreenCursorHidden(true); - g_KBMInput.SetCursorHiddenForUI(true); + g_KBMInput.SetScreenCursorHidden(false); + g_KBMInput.SetCursorHiddenForUI(false); #endif m_labelInventory.init( app.GetString(IDS_INVENTORY) ); @@ -206,14 +214,144 @@ void UIScene_AbstractContainerMenu::tick() { UIScene::tick(); +#ifdef _WINDOWS64 + bool mouseActive = (m_iPad == 0 && g_KBMInput.IsWindowFocused() && !g_KBMInput.IsMouseGrabbed() && g_KBMInput.IsKBMActive() && !g_KBMInput.IsCursorHiddenForUI()); + bool drivePointerFromMouse = false; + float rawMouseMovieX = 0.0f; + float rawMouseMovieY = 0.0f; + int scrollDelta = 0; + + if (mouseActive && g_hWnd) + { + RECT clientRect; + GetClientRect(g_hWnd, &clientRect); + int clientWidth = clientRect.right; + int clientHeight = clientRect.bottom; + if (clientWidth > 0 && clientHeight > 0) + { + int mouseX = g_KBMInput.GetMouseX(); + int mouseY = g_KBMInput.GetMouseY(); + bool mouseMoved = !m_bHasMousePosition || mouseX != m_lastMouseX || mouseY != m_lastMouseY; + + m_bHasMousePosition = true; + m_lastMouseX = mouseX; + m_lastMouseY = mouseY; + scrollDelta = g_KBMInput.GetMouseWheel(); + + // Container coordinates are local to the main panel, so subtract its offset. + float mx = (float)mouseX * ((float)m_movieWidth / (float)clientWidth) - (float)m_controlMainPanel.getXPos(); + float my = (float)mouseY * ((float)m_movieHeight / (float)clientHeight) - (float)m_controlMainPanel.getYPos(); + + rawMouseMovieX = mx; + rawMouseMovieY = my; + + drivePointerFromMouse = m_bPointerDrivenByMouse || mouseMoved + || g_KBMInput.IsMouseButtonDown(KeyboardMouseInput::MOUSE_LEFT) + || g_KBMInput.IsMouseButtonDown(KeyboardMouseInput::MOUSE_RIGHT) + || g_KBMInput.IsMouseButtonDown(KeyboardMouseInput::MOUSE_MIDDLE) + || scrollDelta != 0; + if (drivePointerFromMouse) + { + m_bPointerDrivenByMouse = true; + m_eCurrTapState = eTapStateNoInput; + m_pointerPos.x = mx; + m_pointerPos.y = my; + } + } + } +#endif + onMouseTick(); +#ifdef _WINDOWS64 + if (mouseActive) + { + if (g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_LEFT)) + { + if (m_eCurrSection == eSectionInventoryCreativeSlider) + { + m_bMouseDragSlider = true; + m_pointerPos.x = rawMouseMovieX; + m_pointerPos.y = rawMouseMovieY; + handleOtherClicked(m_iPad, eSectionInventoryCreativeSlider, 0, false); + } + else + { + handleKeyDown(m_iPad, ACTION_MENU_A, false); + } + } + else if (m_bMouseDragSlider && g_KBMInput.IsMouseButtonDown(KeyboardMouseInput::MOUSE_LEFT)) + { + m_pointerPos.x = rawMouseMovieX; + m_pointerPos.y = rawMouseMovieY; + handleOtherClicked(m_iPad, eSectionInventoryCreativeSlider, 0, false); + } + + if (!g_KBMInput.IsMouseButtonDown(KeyboardMouseInput::MOUSE_LEFT)) + m_bMouseDragSlider = false; + + if (g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_RIGHT)) + { + handleKeyDown(m_iPad, ACTION_MENU_X, false); + } + if (g_KBMInput.IsMouseButtonPressed(KeyboardMouseInput::MOUSE_MIDDLE)) + { + handleKeyDown(m_iPad, ACTION_MENU_Y, false); + } + + if (scrollDelta > 0) + { + handleKeyDown(m_iPad, ACTION_MENU_OTHER_STICK_UP, false); + } + else if (scrollDelta < 0) + { + handleKeyDown(m_iPad, ACTION_MENU_OTHER_STICK_DOWN, false); + } + + if (g_KBMInput.IsKeyPressed(VK_ESCAPE)) + { + handleKeyDown(m_iPad, ACTION_MENU_B, false); + return; + } + } +#endif + IggyEvent mouseEvent; S32 width, height; m_parentLayer->getRenderDimensions(width, height); +#ifdef _WINDOWS64 + S32 x; + S32 y; + if (mouseActive && m_bPointerDrivenByMouse && g_hWnd) + { + RECT clientRect; + GetClientRect(g_hWnd, &clientRect); + if (clientRect.right > 0 && clientRect.bottom > 0) + { + float mouseMovieX = (float)g_KBMInput.GetMouseX() * ((float)m_movieWidth / (float)clientRect.right); + float mouseMovieY = (float)g_KBMInput.GetMouseY() * ((float)m_movieHeight / (float)clientRect.bottom); + float mouseLocalX = mouseMovieX - (float)m_controlMainPanel.getXPos(); + float mouseLocalY = mouseMovieY - (float)m_controlMainPanel.getYPos(); + + x = (S32)(mouseLocalX * ((float)width / m_movieWidth)); + y = (S32)(mouseLocalY * ((float)height / m_movieHeight)); + } + else + { + x = (S32)(m_pointerPos.x * ((float)width / m_movieWidth)); + y = (S32)(m_pointerPos.y * ((float)height / m_movieHeight)); + } + } + else + { + x = (S32)(m_pointerPos.x * ((float)width / m_movieWidth)); + y = (S32)(m_pointerPos.y * ((float)height / m_movieHeight)); + } +#else S32 x = (S32)(m_pointerPos.x * ((float)width / m_movieWidth)); S32 y = (S32)(m_pointerPos.y * ((float)height / m_movieHeight)); +#endif IggyMakeEventMouseMove( &mouseEvent, x, y); diff --git a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h index 605f5dbd..d17418bb 100644 --- a/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h +++ b/Minecraft.Client/Common/UI/UIScene_AbstractContainerMenu.h @@ -10,6 +10,12 @@ class UIScene_AbstractContainerMenu : public UIScene, public virtual IUIScene_Ab private: ESceneSection m_focusSection; bool m_bIgnoreInput; +#ifdef _WINDOWS64 + bool m_bMouseDragSlider; + bool m_bHasMousePosition; + int m_lastMouseX; + int m_lastMouseY; +#endif protected: UIControl m_controlMainPanel; diff --git a/Minecraft.Client/Windows64/KeyboardMouseInput.cpp b/Minecraft.Client/Windows64/KeyboardMouseInput.cpp index 6206db87..f24111e3 100644 --- a/Minecraft.Client/Windows64/KeyboardMouseInput.cpp +++ b/Minecraft.Client/Windows64/KeyboardMouseInput.cpp @@ -123,7 +123,7 @@ void KeyboardMouseInput::Tick() } } - if ((m_mouseGrabbed || m_cursorHiddenForUI) && g_hWnd) + if (m_windowFocused && (m_mouseGrabbed || m_cursorHiddenForUI) && g_hWnd) { RECT rc; GetClientRect(g_hWnd, &rc);