在 WindowsForms
中,我只需按照以下方式添加事件处理程序:
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
Debug.WriteLine($"=> Form1_MouseDown, Clicks: {e.Clicks}, Location: {e.Location}");
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
Debug.WriteLine($"=> Form1_MouseUp, Clicks: {e.Clicks}, Location: {e.Location}");
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Debug.WriteLine($"=> Form1_MouseMove, Clicks: {e.Clicks}, Location: {e.Location}");
}
输出结果为:
=> Form1_MouseMove, Clicks: 0, Location: {X=17,Y=21}
=> Form1_MouseDown, Clicks: 1, Location: {X=17,Y=21}
=> Form1_MouseUp, Clicks: 1, Location: {X=17,Y=21}
=> Form1_MouseMove, Clicks: 0, Location: {X=17,Y=21}
您可以看到所有事件都发生在同一位置,那么我的问题是为什么MouseUp
事件之后还会有一个MouseMove
事件?
我还尝试在WPF中使用类似的代码,但MouseMove
事件没有发生。
我也尝试在C++中使用类似的代码,但MouseMove
事件没有发生:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
...
case WM_MOUSEMOVE:
OutputDebugString(L"WM_MOUSEMOVE\n");
break;
case WM_LBUTTONDOWN:
OutputDebugString(L"WM_LBUTTONDOWN\n");
break;
case WM_LBUTTONUP:
OutputDebugString(L"WM_LBUTTONUP\n");
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
this.Capture = false;
添加到MouseDown事件处理程序中以查看差异。 - Hans Passant