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

Jac*_*win 10 c# wpf window capture mouseevent

我有一个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;
}
Run Code Online (Sandbox Code Playgroud)

Ofe*_*ear 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);
}
Run Code Online (Sandbox Code Playgroud)

现在,举例说明如何处理事件:

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());
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*Joe 6

我相信你正在重新发明轮子.搜索"Window.DragMove".

例:

    private void title_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        this.DragMove();
    }
Run Code Online (Sandbox Code Playgroud)