goo*_*dev 15 .net c# windows visual-c++ winforms
在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}");
}
Run Code Online (Sandbox Code Playgroud)
输出为:
=> 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}
Run Code Online (Sandbox Code Playgroud)
您可以看到所有事件都发生在同一位置,所以我的问题是为什么一个MouseMove
事件接一个事件MouseUp
发生?
我也尝试过类似的代码在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;
}
Run Code Online (Sandbox Code Playgroud)
小智 11
如果以前将鼠标放在单独的窗口上,则单击新窗口并移动鼠标焦点将生成鼠标移动事件(即使鼠标在单击鼠标之前或之后没有立即移动)。
这是指向类似StackOverflow响应 “ Ghost”的MouseMove事件的链接。
这是因为通过捕获的鼠标MouseDown
被释放了MouseUp
。而且这MouseMove
可能是为了确保光标位置。作为解决方法,您可以执行此操作
Point LastLocation = Point.Empty;
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
Debug.WriteLine("=> Form1_MouseDown, Clicks: " + e.Location + ", Location: " + e.Location + "");
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
Debug.WriteLine("=> Form1_MouseUp, Clicks: " + e.Location + ", Location: " + e.Location + "");
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (LastLocation != e.Location)
{
LastLocation = e.Location;
Debug.WriteLine("=> Form1_MouseMove, Clicks: " + e.Location + ", Location: " + e.Location + "");
}
}
Run Code Online (Sandbox Code Playgroud)