2011-08-17 28 views
1

我有一个画布,我有一个图像。我可以使用鼠标移动该图像(拖放)。我想阻止用户移动画布外的图像。WPF中的陷阱鼠标

有什么办法可以捕捉鼠标指针,因此它只能在画布内移动?所以当用户试图将鼠标移动到画布外时,光标将保持在画布的边缘。

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

回答

3

经过更多搜索后,我发现user32.dll中有一个名为ClipCursor的函数,它完全符合我的需求。

以下是捕获鼠标光标的示例应用程序示例。单击Button1时,光标将被限制在一个矩形中(10,10,500,500)。当按下按钮2(或关闭应用程序)时,光标将再次释放。

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); 
} 
+0

这一个是一个不错的选择,除了剪辑矩形的坐标是相对于整个屏幕。把它限制在控制极限是很好的。 – StinkyCat

+0

对于任何想在控件上捕捉鼠标的人,请使用给定的解决方案加上[本文的第二个答案](http://stackoverflow.com/questions/4492734/getting-the-top-left-coordinates-of-a- wpf-uielement):'Point targetLoc = this.PointToScreen(new Point(0,0)); System.Drawing.Rectangle r = new System.Drawing.Rectangle((int)targetLoc.X,(int)targetLoc.Y,(int)(targetLoc.X + this.Width),(int)(targetLoc.Y + this .Height));' – StinkyCat

5

行为良好的应用程序不应该试图限制鼠标指针的移动。这是用户,而不是你的应用程序在控制中,以及你描述的行为,当拖动窗口时,鼠标指针不能在任务栏上移动,这并不是我所经历的。

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

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