Я не получил берущих и в конце концов понял это.
Ответ - отслеживать событие QueryContinueDrag. Это событие происходит постоянно во время операции перетаскивания. QueryContinueDragEventArgs содержит свойство Action типа enum DragAction, которое представляет собой DragAction.Cancel, DragAction.Drop или DragAction.Continue. Это свойство чтения / записи, позволяющее вам изменять стандартное поведение (нам это не нужно).
В этом примере кода предполагается, что флаг DragDropInProgress установлен в начале перетаскивания и сбрасывается после успешного завершения перетаскивания. Он ловит окончание DragDrop, потому что пользователь отпустил мышь, не находясь над целью перетаскивания (цели перетаскивания MyControl1 и MyControl2), или отменяет перетаскивание. Если вас не волнует, сбрасывается ли DragDropInProgressFlag до того, как сработают события DragDrop, вы можете обойтись без теста на попадание и просто сбросить флажок.
Private Sub MyControl_QueryContinueDrag(ByVal sender As Object, ByVal e As System.Windows.Forms.QueryContinueDragEventArgs) Handles MyControl.QueryContinueDrag
Dim MousePointerLocation As Point = MousePosition
If e.Action = DragAction.Cancel Then '' User pressed the Escape button
DragDropInProgressFlag = False
End If
If e.Action = DragAction.Drop Then
If Not HitTest(new {MyControl1, MyControl2}, MousePointerLocation) Then
DragDropInProgressFlag = False
End If
End If
End Sub
Private Function HitTest(ByVal ctls() As Control, ByVal p As Point) As Boolean
HitTest = False
For Each ctl In ctls
Dim ClientPoint As Point = ctl.PointToClient(p)
HitTest = HitTest Or (ClientPoint.X >= 0 AndAlso ClientPoint.Y >= 0 AndAlso ClientPoint.X <= ctl.Width AndAlso ClientPoint.Y <= ctl.Height)
If HitTest Then Exit For
Next
End Function
В этом примере HitTest представляет собой рутину, которая занимает позицию мыши (экранную координату) и массив элементов управления и просеивает через массив, передавая значение True, если позиция мыши находится в каком-либо из прямоугольников элементов управления.