Skocz do zawartości

Naprawa zablokowanego kursora myszy podczas obracania kamery i jednoczesnym zminimalizowaniu klienta gry

Opublikowano

👋 Cześć wszystkim!

 

Chciałbym podzielić się z Wami pewnym rozwiązaniem dotyczącym problemu, który sam niedawno napotkałem.

Może niektórzy z Was również zetknęli się z sytuacją, w której podczas obracania kamery i jednoczesnym zminimalizowaniu klienta gry, kursor myszy zostaje zablokowany.

 

Przedstawienie błędu:

minimalize%20bug.gif

 

Lokalizacja pliku: 'UserInterface -> PythonApplicationProcedure.cpp'

 

🔍Znajdź:

🔐 Ukryta Treść 🔐

 

w powyższej funkcji znajdź taki warunek:

🔐 Ukryta Treść 🔐

 

Następnie dodaj:

🔐 Ukryta Treść 🔐

 

Ta linia kodu skutecznie naprawi problem z zawieszającym się kursorem podczas obracania kamery.

 

🎁Bonus

Wrzucam plik 'PythonAplicationProcedure.cpp' z małym code review.

Jeśli chcesz z niego skorzystać zaktualizuj definicje w pliku 'PythonAplication.h'.


Lokalizacja pliku: 'UserInterface -> PythonApplication.h'

 

🔍Znajdź:

🔐 Ukryta Treść 🔐

 

🔄Zmień na:

🔐 Ukryta Treść 🔐

 

🔍Znajdź

🔐 Ukryta Treść 🔐

 

🔄Zmień na:

🔐 Ukryta Treść 🔐

 

 

📈Ulepszony plik: 'UserInterface -> PythonApplicationProcedure.cpp'

Spoiler
🔐 Ukryta Treść 🔐

 

 

Featured Replies

Opublikowano
W dniu 16.08.2023 o 20:32, Sevence napisał(a):

👋 Cześć wszystkim!

 

Chciałbym podzielić się z Wami pewnym rozwiązaniem dotyczącym problemu, który sam niedawno napotkałem.

Może niektórzy z Was również zetknęli się z sytuacją, w której podczas obracania kamery i jednoczesnym zminimalizowaniu klienta gry, kursor myszy zostaje zablokowany.

 

Przedstawienie błędu:

minimalize%20bug.gif

 

Lokalizacja pliku: 'UserInterface -> PythonApplicationProcedure.cpp'

 

🔍Znajdź:

LRESULT CPythonApplication::WindowProcedure

 

w powyższej funkcji znajdź taki warunek:

if (m_isWindowFullScreenEnable)
{
	__MinimizeFullScreenWindow(hWnd, m_dwWidth, m_dwHeight);
}

 

Następnie dodaj:

OnMouseMiddleButtonUp(0, 0);

 

Ta linia kodu skutecznie naprawi problem z zawieszającym się kursorem podczas obracania kamery.

 

🎁Bonus

Wrzucam plik 'PythonAplicationProcedure.cpp' z małym code review.

Jeśli chcesz z niego skorzystać zaktualizuj definicje w pliku 'PythonAplication.h'.


Lokalizacja pliku: 'UserInterface -> PythonApplication.h'

 

🔍Znajdź:

LRESULT WindowProcedure(HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam);

 

🔄Zmień na:

LRESULT WindowProcedure(HWND hWnd, std::uint32_t uiMsg, WPARAM wParam, LPARAM lParam);

 

🔍Znajdź

void __SetFullScreenWindow(HWND hWnd, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP);
void __MinimizeFullScreenWindow(HWND hWnd, DWORD dwWidth, DWORD dwHeight);

 

🔄Zmień na:

void SetFullScreenWindow(HWND hWnd, std::uint32_t dwWidth, std::uint32_t dwHeight, std::uint32_t dwBPP);
void __MinimizeFullScreenWindow(HWND hWnd, std::uint32_t dwWidth, std::uint32_t dwHeight);

 

 

📈Ulepszony plik: 'UserInterface -> PythonApplicationProcedure.cpp'

  Pokaż ukrytą zawartość
#include "StdAfx.h"
#include "PythonApplication.h"
#include "../eterlib/Camera.h"
#include "../CWebBrowser/CWebBrowser.h"
#include <winuser.h>

static int32_t gs_nMouseCaptureRef = 0;

void CPythonApplication::SafeSetCapture()
{
	SetCapture(m_hWnd);
	gs_nMouseCaptureRef++;
}

void CPythonApplication::SafeReleaseCapture()
{
	gs_nMouseCaptureRef--;

	if (gs_nMouseCaptureRef == 0)
	{
		ReleaseCapture();
	}
}

void CPythonApplication::SetFullScreenWindow(HWND hWnd, std::uint32_t dwWidth, std::uint32_t dwHeight, std::uint32_t dwBPP)
{
	if (dwBPP == 0 || dwWidth == 0 || dwHeight == 0)
	{
		return;
	}
	
	DEVMODE DevMode{};
	DevMode.dmSize = sizeof(DevMode);
	DevMode.dmBitsPerPel = dwBPP;
	DevMode.dmPelsWidth = dwWidth;
	DevMode.dmPelsHeight = dwHeight;
	DevMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;

	int32_t Error = ChangeDisplaySettings(&DevMode, CDS_FULLSCREEN);
	
	if (Error == DISP_CHANGE_RESTART)
	{
		ChangeDisplaySettings(nullptr, 0);
	}
}

void CPythonApplication::__MinimizeFullScreenWindow(HWND hWnd, std::uint32_t dwWidth, std::uint32_t dwHeight)
{
	ChangeDisplaySettings(nullptr, 0);
	SetWindowPos(hWnd, nullptr, 0, 0, dwWidth, dwHeight, SWP_SHOWWINDOW);
	ShowWindow(hWnd, SW_MINIMIZE);
}

LRESULT CPythonApplication::WindowProcedure(HWND hWnd, std::uint32_t uiMsg, WPARAM wParam, LPARAM lParam)
{
	const int32_t c_DoubleClickTime = 300;
	const int32_t c_DoubleClickBox = 5;
	static int32_t s_xDownPosition = 0;
	static int32_t s_yDownPosition = 0;

	switch (uiMsg)
	{
		case WM_ACTIVATEAPP:
		{
			m_isActivateWnd = (wParam == WA_ACTIVE) || (wParam == WA_CLICKACTIVE);

			if (m_isActivateWnd)
			{
				m_SoundManager.RestoreVolume();

				if (m_isWindowFullScreenEnable)
				{
					SetFullScreenWindow(hWnd, m_dwWidth, m_dwHeight, m_pySystem.GetBPP());
				}
			}
			else
			{
				m_SoundManager.SaveVolume();

				if (m_isWindowFullScreenEnable)
				{
					__MinimizeFullScreenWindow(hWnd, m_dwWidth, m_dwHeight);
				}

				OnMouseMiddleButtonUp(0, 0);
			}
		}
		break;

		case WM_INPUTLANGCHANGE:
		{
			return CPythonIME::Instance().WMInputLanguage(hWnd, uiMsg, wParam, lParam);
		}

		case WM_IME_STARTCOMPOSITION:
		{
			return CPythonIME::Instance().WMStartComposition(hWnd, uiMsg, wParam, lParam);
		}

		case WM_IME_COMPOSITION:
		{
			return CPythonIME::Instance().WMComposition(hWnd, uiMsg, wParam, lParam);
		}

		case WM_IME_ENDCOMPOSITION:
		{
			return CPythonIME::Instance().WMEndComposition(hWnd, uiMsg, wParam, lParam);
		}
		
		case WM_IME_NOTIFY:
		{
			return CPythonIME::Instance().WMNotify(hWnd, uiMsg, wParam, lParam);
		}

		case WM_IME_SETCONTEXT:
		{
			lParam &= ~(ISC_SHOWUICOMPOSITIONWINDOW | ISC_SHOWUIALLCANDIDATEWINDOW);
		}
		break;

		case WM_CHAR:
		{
			return CPythonIME::Instance().WMChar(hWnd, uiMsg, wParam, lParam);
		}

		case WM_KEYDOWN:
		{
			OnIMEKeyDown(LOWORD(wParam));
		}
		break;

		case WM_LBUTTONDOWN:
		{
			SafeSetCapture();

			if (ELTimer_GetMSec() - m_dwLButtonDownTime < c_DoubleClickTime && abs(LOWORD(lParam) - s_xDownPosition) < c_DoubleClickBox && abs(HIWORD(lParam) - s_yDownPosition) < c_DoubleClickBox)
			{
				m_dwLButtonDownTime = 0;

				OnMouseLeftButtonDoubleClick(int16_t(LOWORD(lParam)), int16_t(HIWORD(lParam)));
			}
			else
			{
				m_dwLButtonDownTime = ELTimer_GetMSec();

				OnMouseLeftButtonDown(int16_t(LOWORD(lParam)), int16_t(HIWORD(lParam)));
			}

			s_xDownPosition = LOWORD(lParam);
			s_yDownPosition = HIWORD(lParam);
			return 0;
		}

		case WM_LBUTTONUP:
		{
			m_dwLButtonUpTime = ELTimer_GetMSec();

			if (hWnd == GetCapture())
			{
				SafeReleaseCapture();
				OnMouseLeftButtonUp(int16_t(LOWORD(lParam)), int16_t(HIWORD(lParam)));
			}
		}
		break;
 
		case WM_MBUTTONDOWN:
		{
			SafeSetCapture();
			UI::CWindowManager::Instance().RunMouseMiddleButtonDown(int16_t(LOWORD(lParam)), int16_t(HIWORD(lParam)));
		}
		break;

		case WM_MBUTTONUP:
		{
			if (GetCapture() == hWnd)
			{
				SafeReleaseCapture();
				UI::CWindowManager::Instance().RunMouseMiddleButtonUp(int16_t(LOWORD(lParam)), int16_t(HIWORD(lParam)));
			}
		}
		break;

		case WM_RBUTTONDOWN:
		{
			SafeSetCapture();
			OnMouseRightButtonDown(int16_t(LOWORD(lParam)), int16_t(HIWORD(lParam)));
			return 0;
		}

		case WM_RBUTTONUP:
		{
			if (hWnd == GetCapture()) 
			{
				SafeReleaseCapture();

				OnMouseRightButtonUp(int16_t(LOWORD(lParam)), int16_t(HIWORD(lParam)));
			}
			
			return 0;
		}

		case 0x20a:
		{
			if (WebBrowser_IsVisible())
			{
				// ;o
			}
			else
			{
				OnMouseWheel(int16_t(HIWORD(wParam)));
			}
		}
		break;

		case WM_SIZE:
		{
			switch (wParam)
			{
				case SIZE_RESTORED:
				case SIZE_MAXIMIZED:
				{
					RECT rcWnd; 
					GetClientRect(&rcWnd); 
				
					uint32_t uWidth = rcWnd.right-rcWnd.left; 
					uint32_t uHeight = rcWnd.bottom-rcWnd.left; 
					m_grpDevice.ResizeBackBuffer(uWidth, uHeight);				
				}
				break;
			}

			if (wParam == SIZE_MINIMIZED)
			{
				m_isMinimizedWnd = true;
			}
			else
			{
				m_isMinimizedWnd = false;
			}

			OnSizeChange(int16_t(LOWORD(lParam)), int16_t(HIWORD(lParam)));
		}
		break;

		case WM_EXITSIZEMOVE:    
		{
			RECT rcWnd; 
			GetClientRect(&rcWnd); 
				
			uint32_t uWidth = rcWnd.right-rcWnd.left; 
			uint32_t uHeight = rcWnd.bottom-rcWnd.left; 
			m_grpDevice.ResizeBackBuffer(uWidth, uHeight);				
			OnSizeChange(int16_t(LOWORD(lParam)), int16_t(HIWORD(lParam)));
		}
		break; 

		case WM_SYSKEYDOWN:
		{
			switch (LOWORD(wParam))
			{
				case VK_F10:
				{
					break;
				}
			}
		}
		break;

		case WM_SYSKEYUP:
		{
			switch(LOWORD(wParam))
			{
				case 18:
				{
					return false;
				}
				case VK_F10:
				{
					break;
				}
			}
		}
		break;

		case WM_SETCURSOR:
		{
			if (IsActive())
			{
				if (m_bCursorVisible && CURSOR_MODE_HARDWARE == m_iCursorMode)
				{
					SetCursor((HCURSOR) m_hCurrentCursor);
					return 0;
				}
				else
				{
					SetCursor(nullptr);
					return 0;
				}
			}
		}
		break;

		case WM_CLOSE:
		{
#ifdef _DEBUG
			PostQuitMessage(0);
#else	
			RunPressExitKey();
#endif
			return 0;
		}

		case WM_DESTROY:
		{
			return 0;
		}
		
		default:
		{
			break;
		}
	}	

	return CMSApplication::WindowProcedure(hWnd, uiMsg, wParam, lParam);
}

 

 


Brakuje coś w kodzie bo wyskakuje mi taki komunikat:
Nie dodawałem ulepszonego pliku

image.thumb.png.3bc2903bd7be7272714455c9eed5ec19.png

Opublikowano
  • Autor

Wejdź do PythonAplication.cpp i PythonAplication.h i zmień __SetFullScreenWindow na SetFullScreenWindow.

Opublikowano
16 minut temu, Sevence napisał(a):

Wejdź do PythonAplication.cpp i PythonAplication.h i zmień __SetFullScreenWindow na SetFullScreenWindow.

Problem Rozwiązany

  • 3 tygodnie później...
Opublikowano

Cholernie to irytuje w wielu grach nie tylko metku, piękna zmiana ❤️

  • 1 miesiąc temu...
Opublikowano

Dzięki

Opublikowano

Dzięki

Opublikowano

Wspaniale, że udostępniłeś kod naprawiający ten błąd!

 

  • 1 miesiąc temu...
Opublikowano

Fajnie bede testował.

Edytowane przez Dziki Czan

Opublikowano

Po tych zmianach nie można ot tak złapać okno i przenieść. Trzeba najpierw kliknąć na pulpit a potem można przenieść okno

Opublikowano
4 godziny temu, Dziki Czan napisał(a):

Po tych zmianach nie można ot tak złapać okno i przenieść. Trzeba najpierw kliknąć na pulpit a potem można przenieść okno

Czyli działa 😄

Opublikowano
Godzinę temu, Marchewa napisał(a):

Czyli działa 😄

Naprawia jedno, ale psuje drugie, trzeba wybrać po prostu co komu lepsze xd

Opublikowano
22 minuty temu, Dziki Czan napisał(a):

Naprawia jedno, ale psuje drugie, trzeba wybrać po prostu co komu lepsze xd

Nie wiem czy ta poprawka też trochęnie utrudni korzystania z autoklikera Tiny Task ;d

Opublikowano
  • Autor

Hmm, sprawdzę ten problem i ewentualnie zaktualizuje poradnik. 

  • 2 miesiące temu...
Opublikowano

Dzięki

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...