Until 2005 I used a combination that returned "@" when in a command and a point otherwise. Code below.
Now midpoint has become a modifier in 2005, by typing either M2P or MTP.
(defun midp (/ p1 p2)
(cond ((and (setq p1 (getpoint "\First point: "))
(setq p2 (getpoint "\Second point: "))
(setq p3 (mapcar (function (lambda (n) (/ n 2.0))) (mapcar '+ p1 p2)))
(setvar "LASTPOINT" p3)
)
(if (> (getvar "CMDACTIVE") 0) "@" p3)
)
)
)