Ну, если взять утилитку Spy++ и поглядеть, что происходит при двойном клике, то можно увидеть, что происходит примерно следующее:
<00001> 000103FE P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:190 yPos:123
<00002> 000103FE P WM_LBUTTONUP fwKeys:0000 xPos:190 yPos:123
<00003> 000103FE P WM_LBUTTONDBLCLK fwKeys:MK_LBUTTON xPos:190 yPos:123
<00004> 000103FE P WM_LBUTTONUP fwKeys:0000 xPos:190 yPos:123
Стало быть, система не запаривается и посылает WM_LBUTTONUP всякий раз, когда происходит клик мышью. А вот прежде чем отправить WM_LBUTTONDOWN, проверяет, прошёл ли таймаут (например, 200 мс) с момента предыдущего WM_LBUTTONDOWN. Если прошёл - вместо него высылается WM_LBUTTONDBLCLK.
Собственно, если я всё правильно понимаю, LBUTTONDOWN vs. LBUTTONDBLCLK - и есть первичное отличие клика от дабл-клика.
Поскольку "тройной клик" в системе не реализован, то попытка выполнить что-то похожее даст:
<00001> 000103FE P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:77 yPos:467
<00002> 000103FE P WM_LBUTTONUP fwKeys:0000 xPos:77 yPos:467
<00003> 000103FE P WM_LBUTTONDBLCLK fwKeys:MK_LBUTTON xPos:77 yPos:467
<00004> 000103FE P WM_LBUTTONUP fwKeys:0000 xPos:77 yPos:467
<00005> 000103FE P WM_LBUTTONDOWN fwKeys:MK_LBUTTON xPos:77 yPos:467
<00006> 000103FE P WM_LBUTTONUP fwKeys:0000 xPos:77 yPos:467
То есть, клик+дабл-клик+клик.
А как это всё обрабатывать... Надо думать, здесь уже каждое окно реализует своё поведение, и есть стандартное поведение, уведомляющее о типе клика родителя. В любом случае, вручную такое реализовывать - задержка потребуется. Я не вижу другого способа заглянуть в будущее и убедиться, что данный клик не будет двойным.
ЗЫ. Да, кстати, задержка 200мс в случае Windows - именно с момента BUTTONDOWN, а не UP. Так что для пользователя она не будет слишком большой
ЗЗЫ. Кстати, именно поэтому (и не только) в первом твоём примере кода строчка
lastTicks = DateTime.Now.Ticks;
должна предварять всю остальную обработку.