2009-08-14 15 views
5

Jak sprawdzić, czy lewy przycisk myszy jest aktualnie wciśnięty/przeciągnięty (preferuję pierwszą opcję).Sprawdź, czy przycisk myszy L jest wyłączony?

Próbowałem Mouse.IsDraging, ale bez rezultatu.

UWAGA: Obsługuję komunikaty myszy w mojej aplikacji, więc nie ma problemu, jeśli jest to WM, po prostu udostępnij sposób na wykonanie mojego zadania.

+0

Możliwy duplikat [Delphi: Jak mogę sprawdzić, czy nie są naciskane przyciski myszy - poza zdarzenia myszy] (http://stackoverflow.com/questions/25681543/delphi-how-can-i -check-jeśli-jak-przyciski-myszy-są wciśnięte-na zewnątrz-myszy-ev) – Johan

Odpowiedz

20

Istnieje funkcja API systemu Windows GetAsyncKeyState(), która pomimo swojej nazwy jest również użyta do uzyskania stanu przycisków myszy. Połączona dokumentacja zawiera bezpośrednio odpowiedź na pytanie:

Funkcja GetAsyncKeyState działa z przyciskami myszy. Jednak sprawdza stan fizycznych przycisków myszy, a nie logicznych przycisków myszy, do których przypisane są fizyczne przyciski. Na przykład wywołanie GetAsyncKeyState(VK_LBUTTON) zawsze zwraca stan lewego fizycznego przycisku myszy, niezależnie od tego, czy jest odwzorowany na lewy czy prawy przycisk myszy logicznej. Możesz określić aktualne mapowanie fizycznych przycisków myszy na logiczne przyciski myszy, wywołując GetSystemMetrics(SM_SWAPBUTTON), która zwraca TRUE, jeśli przyciski myszy zostały zamienione.

Typ wyniku to short, w celu sprawdzenia najbardziej znaczącego bitu wystarczy sprawdzić, czy wartość jest ujemna.

+0

Bardzo ładne. Chociaż dajesz rozwiązanie dotyczące sprawdzenia najbardziej znaczącego fragmentu, czy mógłbyś opisać formalny sposób jego uzyskania? – Vassilis

+0

@VassilisGr: Przepraszam, nie rozumiem tej prośby. Pozostawienie przymusu typowi kompilatorowi jest prawdopodobnie najlepszym (tj. Formalnym?) Zadaniem, ponieważ izoluje od problemów takich jak kompilacja 32- i 64-bitowa. Czy masz na myśli, jak sprawdzić, czy ten pojedynczy bit w wyniku jest ustawiony, czy nie? Po prostu użyj czegoś takiego jak '(wynik i 8000 $) <> 0'. – mghie

+0

szukał '(wynik i 8000 $) <> 0'. Dzięki! – Vassilis

0
OnMouseMove(UINT nFlags, CPoint point) 
{ 
    m_LButtonPressed=nFlags & MK_LBUTTON; 
    CWnd::OnMouseMove(nFlags, point); 
} 
Powiązane problemy