WPF中的陷阱鼠标

时间:2011-08-17 08:46:10

标签: c# wpf mouse

我有一个画布,我有一个图像。我可以使用鼠标移动该图像(拖放)。我想阻止用户将图像移到画布之外。

有什么方法可以捕获鼠标指针,使它只能在画布内移动?因此,当用户尝试将鼠标移动到画布外时,光标将保留在画布的边缘。

此行为的一个示例是移动窗口时,您无法在任务栏上移动它。当您尝试在任务栏上移动它时,鼠标光标停留在任务栏的边缘,拒绝移动任务栏顶部。

2 个答案:

答案 0 :(得分:5)

行为良好的应用程序不应该尝试约束鼠标指针的移动。用户而不是您的应用程序是否处于控制状态,您描述的拖动窗口时鼠标指针无法在任务栏上移动的行为不是我所经历过的。

但是,当用户在画布中拖动图像时,您可以限制图像的移动,使其即使在用户将鼠标指针移动到画布外时也会保留在画布内。

在Windows中执行拖动操作时,通常capture the mouse。这意味着即使应用程序窗口移出应用程序窗口,您的应用程序仍会继续接收有关鼠标指针移动的信息。

答案 1 :(得分:3)

经过多次搜索,我发现user32.dll中有一个名为ClipCursor的函数正是我想做的。

以下是捕获鼠标光标的示例应用程序示例。单击Button1时,光标将被限制在(10,10,500,500)的矩形中。按下Button2(或关闭应用程序)时,光标将再次空闲。

XAML:

<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>

CS:

[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);
}