Sposób na przechwycenie WM_LBUTTONDBLCLK

0

Witam,

mam hooka LLH na WH_MOUSE, jedyne zdarzenia jakie przechwytuję to typowe kliknięcie, LPM_UP i LPM_DOWN.
Zdarzenie WM_LBUTTONDBLCLK nie jest w tym hooku obsługiwane.

Pytanie: W jaki sposób najlepiej zliczyć kliknięcia w danym odstępie czasu i wykonać akcję na ON_DB_CLICK?

Myślałem nad wrzuceniem na forme Timer ustawienie intervale na 500, dodanie zmiennej globalnej licznik typu integer i po każdym przechwyceniu zdarzenia on click zwiększać zmienną +1 a timer sprawdzałby czy ilość jest większa bądź równa 2 i na koniec ustawiał zmienną DB_Click na True.

Jest to trochę słabe rozwiązanie moim zdaniem i zastanawiam się czy jest coś lepszego?

0
From MSDN: napisał(a)

"Only windows that have the CS_DBLCLKS style can receive WM_LBUTTONDBLCLK messages, which the system generates whenever the user presses, releases, and again presses the left mouse button within the system's double-click time limit. Double-clicking the left mouse button actually generates a sequence of four messages: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK, and WM_LBUTTONUP. "

Źródło: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645606(v=vs.85).aspx


Zwróć także uwagę na sekwencję komunikatów:

  1. WM_LBUTTONDOWN
  2. WM_LBUTTONUP
  3. WM_LBUTTONDBLCLK
  4. WM_LBUTTONUP
    Musisz odpowiednio zareagować na pierwsze kliknięcie, jeśli dla podwójnego kliknięcia ma być inne zadanie;

A jeśli chodzi o ręczny timer - nie można ustawiać statycznego czasu, bo w systemie może on być różnie ustawiony; Żeby odczytać czas dla podwójnego kliknięcia jaki jest ustawiony w systemie należy skorzystać z funkcji GetDoubleClickTime.

0

Ponownie mam "deżawi". Niedawno było identyczne pytanie tutaj. A komunikat WM_LBUTTONDBLCLK może odebrać tylko okno posiadające styl CS_DBLCLKS. Zobacz na kod dołaczony do tego posta. Szczególnie exek i kod w podkatalogu EXAMPLE_APP.

0

Dzięki za podpowiedzi, ale niestety to nie pomoże... Program służy do nagrywania akcji myszy które wykonuje użytkownik a następnie ich odtwarzania. Problem jest gdy muszę nagrać moment DBClick myszy i zrobić inserta do bazy pod postacią np. Pos.X, Pos.Y, 'DBClick

Nie mam kontroli nad innymi aplikacjami w których nagrywany jest ruch myszy przez użytkownika. Pozostaje mi chyba kombinowanie tak jak napisał @furious programming. Chyba, że jest jeszcze jakieś rozwiązanie?

0

Chyba pozostaje to rozwązać, tak jak opisal @furious programming. Jeżeli koniecznie musisz mieć rozróżnenie na dwuklik, a nie po porstu zapisywać klikięcia i puszczenia myszki to można sprawdzać czasy kliknięć, a konkretniej puszczeń przycisku myszki i porównywać ze wspomnianą funkcją. Jednak mogę się mylić co do takiej koncepcji. Jeżeli ktoś zna jeszcze jakieś rozwiązania to być może coś jeszcze tutaj Tobie dodatkowego podpowie.

0

Czemu wszyscy mają taką nieodpartą chęć przechwytywania komunikatów, generowania kliknięć, klawiszy, grzebania po pamięci innych procesów... powinno to być bardzo rzadką potrzebą, a z lektury forum można mieć wrażenie, że to drugi etap po Hello worldzie.

1

Ja w swoim programie wykrywam klik pojedynczy i podwójny tak:

Ustawienia początkowe TimerMouse:
Interval:=300;
Enabled:=false;

Case wParam of
  WM_LBUTTONUP: If TimerMouseClick.Enabled then
                Begin //jeśli w limicie czasu na podwójny klik wystąpiło drugie lewo-kliknięcie, to uznanie kliku jako podwójnego
                  TimerMouseClick.Enabled:=false;
                  //tu akcje dla kliku podwójnego
                  //...
                End
                else TimerMouseClick.Enabled:=true; //interwał timera określa limit czasu na podwójny klik. Gdy limit czasu minie, to w zdarzeniu TimerMouseClickTimer uznanie kliku jako pojedynczego

              
procedure TForm1.TimerMouseClickTimer(Sender: TObject);
begin
  TimerMouseClick.Enabled:=false; //minął limit czasu na podwójny lewo-klik
  //tu akcje dla kliku pojedynczego
  //...
end; 
0

Dzięki @marogo Twój przykład sprawdza się idealnie.
Dzięki wszystkim, którzy próbowali pomóc.

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