C# WPF中的陷阱鼠标

C# WPF中的陷阱鼠标,c#,wpf,mouse,C#,Wpf,Mouse,我有一张画布,上面有一个图像。我可以使用鼠标拖放来移动该图像。我想防止用户将图像移到画布之外 我有没有办法捕捉鼠标指针,使其只能在画布内移动?因此,当用户尝试将鼠标移到画布外时,光标将保持在画布的边缘 这种行为的一个例子是,当移动窗口时,您不能在任务栏上移动它。当您尝试在任务栏上移动鼠标时,鼠标光标停留在任务栏边缘,拒绝在任务栏顶部移动。性能良好的应用程序不应试图限制鼠标指针的移动。是用户而不是你的应用程序在控制,你描述的鼠标指针在拖动窗口时无法在任务栏上移动的行为我没有经历过 但是,当用户在画

我有一张画布,上面有一个图像。我可以使用鼠标拖放来移动该图像。我想防止用户将图像移到画布之外

我有没有办法捕捉鼠标指针,使其只能在画布内移动?因此,当用户尝试将鼠标移到画布外时,光标将保持在画布的边缘


这种行为的一个例子是,当移动窗口时,您不能在任务栏上移动它。当您尝试在任务栏上移动鼠标时,鼠标光标停留在任务栏边缘,拒绝在任务栏顶部移动。

性能良好的应用程序不应试图限制鼠标指针的移动。是用户而不是你的应用程序在控制,你描述的鼠标指针在拖动窗口时无法在任务栏上移动的行为我没有经历过

但是,当用户在画布中拖动图像时,您可以约束图像的移动,以便即使用户将鼠标指针移到画布之外,图像仍保持在画布内


在Windows中执行拖动操作时,您通常会看到。这意味着您的应用程序即使在移动到应用程序窗口之外时也会不断接收有关鼠标指针移动的信息。

性能良好的应用程序不应试图限制鼠标指针的移动。是用户而不是你的应用程序在控制,你描述的鼠标指针在拖动窗口时无法在任务栏上移动的行为我没有经历过

但是,当用户在画布中拖动图像时,您可以约束图像的移动,以便即使用户将鼠标指针移到画布之外,图像仍保持在画布内


在Windows中执行拖动操作时,您通常会看到。这意味着您的应用程序即使在鼠标指针移动到应用程序窗口之外时,也会不断接收有关鼠标指针移动的信息。

在进一步搜索之后,我发现user32.dll中有一个名为ClipCursor的函数,它正是我想要的

下面是一个捕获鼠标光标的示例应用程序。单击按钮1时,光标将被约束在10,10500500处的矩形中。按下按钮2或关闭应用程序时,光标将再次自由移动

XAML:


在进一步搜索之后,我发现user32.dll中有一个名为ClipCursor的函数,它完全符合我的要求

下面是一个捕获鼠标光标的示例应用程序。单击按钮1时,光标将被约束在10,10500500处的矩形中。按下按钮2或关闭应用程序时,光标将再次自由移动

XAML:


这是一个不错的选择,除了剪切矩形的坐标相对于整个屏幕。最好将其限制在控件的限制范围内。对于任何希望在控件上捕获鼠标的人,请使用给定的解决方案加上:Point targetLoc=this.PointToScreennew Point0,0;System.Drawing.Rectangle r=新的System.Drawing.RectangleinttargetLoc.X,inttargetLoc.Y,inttargetLoc.X+此.Width,inttargetLoc.Y+此.Height;这是一个不错的选择,除了剪切矩形的坐标相对于整个屏幕。最好将其限制在控件的限制范围内。对于任何希望在控件上捕获鼠标的人,请使用给定的解决方案加上:Point targetLoc=this.PointToScreennew Point0,0;System.Drawing.Rectangle r=新的System.Drawing.RectangleinttargetLoc.X,inttargetLoc.Y,inttargetLoc.X+此.Width,inttargetLoc.Y+此.Height;
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,41,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="button2_Click" />
    </Grid>
</Window>
[DllImport("user32.dll")]
static extern void ClipCursor(ref System.Drawing.Rectangle rect);

[DllImport("user32.dll")]
static extern void ClipCursor(IntPtr rect);

public MainWindow()
{
    InitializeComponent();
}

private void button1_Click(object sender, RoutedEventArgs e)
{
    System.Drawing.Rectangle r = new System.Drawing.Rectangle(10, 10, 500, 500);
    ClipCursor(ref r);
}

private void button2_Click(object sender, RoutedEventArgs e)
{
    ClipCursor(IntPtr.Zero);
}