Вам, вероятно, нужно захватывать мышь, помимо обработки сообщений мыши о нажатиях / подъемах.
К сожалению, лучший способ захватить мышь - это отслеживать сообщение WM_CAPTURECHANGED, означающее, что нам нужно перейти в Win32 API, чтобы отслеживать это событие, поскольку Windows Forms не определяют соответствующее событие.
Например, чтобы обработать это сообщение Win32, сначала вы определяете внутренний класс для обработки низкоуровневого сообщения WM_CAPTURECHANGED и определяете обработчик события:
public partial class Form1 : Form
{
class CaptureChangedWindow : NativeWindow
{
public CaptureChanged OnCaptureChanged;
protected override void WndProc(ref Message m)
{
if (m.Msg == 533) // WM_CAPTURECHANGED
OnCaptureChanged();
base.WndProc(ref m);
}
}
public delegate void CaptureChanged();
...
}
Далее объявите поле члена для хранения экземпляра CaptureChangedWindow:
public partial class Form1 : Form
{
CaptureChangedWindow ccw;
...
}
Далее определите метод, который будет вызываться при вызове делегата CaptureChanged:
public partial class Form1 : Form
{
private void CaptureChangedEventHandler()
{
// your code
// e.g. now it's safe to assume that mouse is captured
}
...
}
Наконец, измените конструктор, чтобы создать и инициализировать вложенный класс:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ccw = new CaptureChangedWindow();
ccw.AssignHandle(Handle);
ccw.OnCaptureChanged +=
new CaptureChanged(CaptureChangedEventHandler);
}
...
}
Это все, что тебе нужно. Затем вы можете обрабатывать другие события мыши как обычно.