1) if you want to ensure your display is only presented when a vsync occurs, then use D3DPRESENT_INTERVAL_DEFAULT or D3DPRESENT_INTERVAL_ONE.
2) if you want to do some processing while Present() is waiting for the vsync, you can use the D3DPRESENT_DONOTWAIT flag with IDirect3DSwapChain9::Present, this will return D3DERR_WASSTILLDRAWING if the presentation (and vsync) hasn't yet taken place. You can call IDirect3DDevice9::GetSwapChain to get the default swap chain.
3) You can also use IDirect3DDevice9::GetRasterStatus to determine whether the raster (scan line) is in the vertical sync area. This does require driver and hardware support, you can determine whether yours supports it by checking D3DCAPS9.Caps for D3DCAPS_READ_SCANLINE. All modern graphics hardware I know of does expose that cap, but it may also be dependent on the age/type of monitor/TV being used.
Cribbed from: http://www.gamedev.net/topic/319407-wait-for-vsync/