【问题标题】:How can I capture mouse events that occur outside of a (WPF) window?如何捕获在 (WPF) 窗口之外发生的鼠标事件?
【发布时间】:2012-11-23 19:12:45
【问题描述】:

我有一个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;
}

【问题讨论】:

    标签: c# wpf window mouseevent capture


    【解决方案1】:

    我相信您正在重新发明轮子。搜索“Window.DragMove”。

    例子:

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

    【讨论】:

      【解决方案2】:

      我想你正在寻找这个:Processing Global Mouse and Keyboard Hooks in C#

      网址:Processing Global Mouse and Keyboard Hooks in 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());
      }
      

      【讨论】:

        【解决方案3】:

        试试这个方法:

        // 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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-11
          • 1970-01-01
          • 2015-12-22
          • 1970-01-01
          • 2016-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多