[C++ MFC] MK_SHIFT wyłapanie

0

Witam.

BOOL PreTranslateMessage(MSG* pMsg) 
{
	// ruch myszy
	if (pMsg->message==WM_MOUSEMOVE)
	{
		if ((pMsg->wParam & MK_SHIFT)==MK_SHIFT)
		{
			// wciśnięcie SHIFTa przy ruchu myszy
		}
	}

	return CDialog::PreTranslateMessage(pMsg);
}

Czy można wyłapać tylko wciśnięcie SHIFTa, gdy mysz nie wysyła komunikatu o ruchu (stoi)?

0

podpatrzyłem na debuggerze, jak naciskasz shift jedyny komunikat jaki dochodzi ma wartość 274(komunikat ten ), po chwili szukania w WinUser:
#define WM_NCMOUSELEAVE 0x02A2
może w tym komunikacie sprawdzaj naciśnięcie shifta, aha jako że jest to komunikat WM_N... po sprawdzeniu zwróć return DefWindowProc(... a nie 0 jakto zwykle bywa w obsłudze komunikatów...

tyle wniosków bez patrzenia do msnd, sprawdź sobie co oznacza dokładnie ten komunikat, oczywiście po nazwie można się domyślać, ale lepiej mieć pewność...

0

crazye: 274 = 0x0112 = WM_SYSCOMMAND
Poza tym gadasz głupoty. Po wciśnięciu każdego klawisza leci WM_KEYDOWN (dla shifta wParam==VK_SHIFT).

// czeski błąd poprawiłem - R

0

racja, WM_KEYDOWN leci nawet przy shift
hah, znowu pomyłka :> nie wiem jak ja patrzyłem :D

@autor :>
czyli twoje PreTranslateMessage:

BOOL PreTranslateMessage(MSG* pMsg)
{
        if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_SHIFT)//lub WM_KEYUP
        {
          //poszedl shift
        }

        return CDialog::PreTranslateMessage(pMsg);
}
0

Doczytaj jeszcze co jest w lParam, bo możesz się zdziwić efektem powyższej instrukcji :)

0

Zgadza się:

Naciśnięcie Shifta:

if (pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_SHIFT)

Puszczenie Shifta, trochę inaczej:

if (pMsg->message==WM_KEYUP && (pMsg->wParam & MK_SHIFT)!=MK_SHIFT)

Dzięki za pomoc

0

Puszczenie Shifta powinno być zrobione tak samo jak wciśnięcie:

if (pMsg->message==WM_KEYUP && pMsg->wParam==VK_SHIFT)

Makr MK_XXX używa się przy zdarzeniach myszy WM_MOUSEMOVE, WM_LBUTTONXXX etc.

0

fakt, też działa...

1 użytkowników online, w tym zalogowanych: 0, gości: 1