如何捕获发生在(WPF)窗口外的鼠标事件?

11

我有一个Window元素,它的WindowStyle="None"AllowsTransparency="True",因此它没有标题栏且支持透明度。

我希望用户可以通过在窗口内部任何位置左键单击并拖动来将窗口移动到屏幕上的任意位置。只要按下左键不松开,窗口就会随着鼠标一起移动。

我已经实现了这个功能,但有一个例外:当鼠标移动到窗口外部时(例如当左键单击靠近窗口边缘并快速移动鼠标时),窗口不再捕获鼠标位置,也不再随着鼠标一起移动。

以下是我用于完成任务的后台代码:

public Point MouseDownPosition { get; set; }
public Point MousePosition { get; set; }
public bool MouseIsDown { get; set; }

private void window_MyWindowName_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    MouseDownPosition = e.GetPosition(null);
    MouseIsDown = true;
}

private void window_MyWindowName_MouseMove(object sender, MouseEventArgs e)
{
    if (MouseIsDown)
    {
        MousePosition = e.GetPosition(null);
        Left += MousePosition.X - MouseDownPosition.X;
        Top += MousePosition.Y - MouseDownPosition.Y;
    }
}

private void window_MyWindowName_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    MouseIsDown = false;
}
3个回答

9
我认为您正在寻找的是:在C#中处理全局鼠标和键盘钩子
网址:在C#中处理全局鼠标和键盘钩子 这个类允许您拦截键盘和鼠标,并/或者检测它们的活动,即使应用程序在后台运行或根本没有任何用户界面。
此类通过KeyEventArgs和MouseEventArgs引发常见的.NET事件,因此您可以轻松地检索所需的任何信息。
有一个示例、说明和演示供您使用。
非常棒的教程!
示例:
UserActivityHook actHook;
void MainFormLoad(object sender, System.EventArgs e)
{
    actHook= new UserActivityHook(); // crate an instance

    // hang on events

    actHook.OnMouseActivity+=new MouseEventHandler(MouseMoved);
    actHook.KeyDown+=new KeyEventHandler(MyKeyDown);
    actHook.KeyPress+=new KeyPressEventHandler(MyKeyPress);
    actHook.KeyUp+=new KeyEventHandler(MyKeyUp);
}

现在,来看一个处理事件的例子:
public void MouseMoved(object sender, MouseEventArgs e)
{
    labelMousePosition.Text=String.Format("x={0}  y={1}", e.X, e.Y);
    if (e.Clicks>0) LogWrite("MouseButton     - " + e.Button.ToString());
}

6

我认为你在重复造轮子。搜索“Window.DragMove”。

示例:

    private void title_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        this.DragMove();
    }

0

尝试这种方式:

// method to convert from 'old' WinForms Point to 'new' WPF Point structure:
public System.Windows.Point ConvertToPoint(System.Drawing.Point p)
{
    return new System.Windows.Point(p.X,p.Y);
}

// some locals you will need:
bool mid = false; // Mouse Is Down
int x=0, y=0;

// Mouse down event
private void MainForm_MouseDown(object sender, MouseButtonEventArgs e)
{
   mid=true;
   Point p =  e.GetPosition(this);

   x = (int)p.X; 
   y = (int)p.Y;
}

// Mouse move event
private void MainForm_MouseMove(object sender, MouseButtonEventArgs e)
{
   if(mid)
   {
        int x1 = e.GetPosition(this).X;
        int y1 = e.GetPosition(this).Y;

        Left = x1-x;
        Top = y1-y;
   }
}

// Mouse up event
private void MainForm_MouseUp(object sender, MouseButtonEventArgs e)
{
    mid = false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接