Нет, это почти невозможно, если у вас нет машины времени. И это даже не имеет смысла, когда вы понимаете, как Windows отличает двойной щелчок от одного щелчка.
Оказывается, Рэймонд Чен (Raymond Chen) (разработчик из команды Windows Shell) точно объясняет это в записи блога под названием " Логические последствия того, как Windows преобразует одиночные щелчки в двойные щелчки ".
В частности, Windows знает, что нужно интерпретировать что-то как двойной щелчок, потому что второй щелчок произошел в интервале, заданном функцией GetDoubleClickTime
.Поскольку для ясности (как красноречиво выразился Рэймонд) потребуется определенное время, чтобы определить впереди времени, если что-то будет одним или двойным щелчком, оконный менеджер отправляется вперед и отправляет WM_LBUTTONDOWN
сообщение , как только будет получен первый щелчок.Сообщение WM_LBUTTONDBLCLK
отправляется только позже, после подтверждения второго щелчка, который фактически представляет собой двойной щелчок.В результате ваше приложение всегда будет получать два WM_LBUTTONDOWN
сообщения для каждого полученного WM_LBUTTONDBLCLK
сообщения.
Теперь разработчики .NET Framework поняли, как работает этот процесс, и спроектировали его.события, которые поднимаются соответственно.Конечно, они ничего не могут сделать с одним щелчком, который всегда происходит перед двойным щелчком, но они смогли подавить сообщение о втором щелчке, если будет установлено, что пользователь намеревался принять участие в событии двойного щелчка.Как указывается в документации к событию Control.MouseClick
(что примерно соответствует сообщению WM_LBUTTONDOWN
):
Два отдельных щелчка, которые происходят достаточно близко во времени, как определенов соответствии с настройками мыши операционной системы пользователя будет генерироваться событие MouseDoubleClick
вместо второго события MouseClick
.
Статья в блоге Раймонда, на которую я ссылался выше, предлагает возможноеОбходной путь для приложений и разработчиков, которые настаивают на дизайне, в котором действие двойного щелчка не связано с действием одного щелчка (хотя никто из нас не рекомендует вам это делать):
Теперь предположим, что вы 'это программа, которая, тем не менее, хочет продолжить сомнительный дизайн, когда действие двойного щелчка не связано с действием одного щелчка.Что вы делаете?
Ну, одну вещь, которую вы могли бы сделать, это ничего не делать при получении сообщения WM_LBUTTONDOWN
, кроме установки таймера на срабатывание в GetDoubleClickTime()
миллисекунд.[Исправлено в 10:00.] Если вы получили сообщение WM_LBUTTONDBLCLK
за это время, то это был двойной щелчок.Если вы этого не сделаете, то это должен был быть один щелчок, чтобы вы могли выполнить действие одним щелчком (хотя и с небольшим опозданием).