At least up to R2014a, there is an undocumented routine that makes your life easier. Up to that version (no idea about later), look for example in the source for datacursormode near line 780, at function localWindowMotionFcn . Apparently there is an undocumented routine hittest(), and if you pass in the handle of your current figure, it will return the handle of the object under the current point.
Be sure to use this under a WindowButtonMotionFcn rather than a *ButtonDownFcn as those latter only activate upon click of a pickable hittest-able object .
Ah, there is a limitation for this: hittest() will not register objects whose Hittest property is off. But checking, I see that if you give hittest() the option 'axes' then handle() of the axes will be returned even if the axes has hittest off. Or at least so it goes up to R2014a.