I think the vertical size of a ListView row is the larger of (1) the height of the images in the SmallImageList property and (2) the line height of the ListView's Font. So you could use one of these values to determine the row height and convert row position to pixels.
BTW, nice tip on the LockWindowUpdate.
As an aside, I'm noticing that, when you change the sort direction of a ListView, the ListView seems to get a new window handle, complete re-draw itself, and arbitrarily scroll the view downward some number of pixels (occasionally it will be upward), even if you send it an LVM_SCROLL message with a vertical component. Very strange behavior.