После небольшого прочтения в MSDN, я думаю, что объяснение этого поведения заключается в этом замечании на странице WM_LBUTTONDBLCLK
:
Только окна с CS_DBLCLKS
стиль можно получить WM_LBUTTONDBLCLK
сообщения, которые генерирует система
всякий раз, когда пользователь нажимает, отпускает,
и снова нажимает левую мышь
кнопка в системе
двойной щелчок по времени.
Если ваша программа возвращает ненулевое значение, когда она обрабатывает WM_LBUTTONDOWN
или WM_LBUTTONUP
, то эти сообщения не отправляются в целевое окно - как ожидалось. Тем не менее, мой вывод, основанный на приведенной выше цитате, заключается в том, что, поскольку ни одно окно со стилем CS_DBLCLKS
не получает сообщения (так как ловушка препятствует любому окну принимать сообщения), система поэтому не нужно генерировать WM_LBUTTONDBLCLK
.
Другими словами, система генерирует WM_LBUTTONDBLCLK
только тогда и только тогда, когда (a) окно получает предыдущие WM_LBUTTONDOWN
/ WM_LBUTTONUP
сообщения и (b) это окно имеет стиль CS_DBLCLKS
Поскольку ваш хук предотвращает выполнение условия (a), WM_LBUTTONDBLCLK
никогда не генерируется, и вместо этого отправляется сообщение WM_LBUTTONDOWN
.
Что касается обходного пути, я сомневаюсь, что есть идеальное решение. Я предполагаю, что причина, по которой вы хотите получить сообщение WM_LBUTTONDBLCLK
, заключается в том, что ваша ловушка знает, представляет ли обычное сообщение WM_LBUTTONDOWN
второй щелчок двойного щелчка, верно? В этом случае вы можете прочитать время двойного щелчка в реестре, как предлагает Фейсал, и подсчитать время между сообщениями WM_LBUTTONDOWN
, однако велика вероятность того, что вы получите неточные результаты (из-за задержки время между отправляемыми сообщениями). В качестве альтернативы, если есть какой-то способ вместо этого перенаправить сообщения WM_LBUTTONDOWN
/ WM_LBUTTONUP
в скрытое окно, которым владеет ваш хук (который имеет стиль CS_DBLCLKS
), система может в итоге сгенерировать сообщение WM_LBUTTONDBLCLK
и отправить это к вашему скрытому окну, которое вы можете затем обработать в WndProc
этого окна (хотя у меня нет большого опыта с перехватом, поэтому я не знаю, возможно ли это).