2016-08-16 68 views
0

我有一个用C#编写的应用程序,它是一个以幻灯片显示方式显示信息的目录系统。如何处理底层窗体中的MouseMoveEvent而不是其中的面板?

在我的Form我有一个Panel停靠填写表单的内容。在该面板内部有9个面板,每个面板显示特定对象的信息。

现在我想要的是,只要我移动鼠标,我想触发主机面板的形式的MouseMoveEvent,而不是那些大面板或其中的面板。

这里是我的代码处理表单的MouseMoveEvent

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    MessageBox.Show("Moved!"); 
} 

我知道这将不会触发因为鼠标光标在面板内部,但如何反正触发表单上的事件?

这样做的目的是隐藏当前窗体并在窗体移动时显示另一个窗体。有可能的?

+0

所以你想从子面板的鼠标移动中触发Form控件的OnMouseMove(比如'FrmMain_OnMouseMove')。不是吗? –

+0

是的,先生,该功能将隐藏当前的'form'并显示另一个'form',这就像是一个屏幕保护程序,当鼠标移动桌面UI时出现。 –

+0

您可以使用低级别的鼠标钩子。 [请检查此主题](http://stackoverflow.com/questions/2063974/how-do-i-capture-the-mouse-move-event) – drak1988

回答

0

我从How do I capture the mouse move event修改答案,因为公认的答案被连续射击,即使鼠标没有根据@Randy Gamage评论移动解决问题。

我用这段代码解决了它。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 

namespace GlobalMouseEvents 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
     GlobalMouseHandler gmh = new GlobalMouseHandler(); 
     gmh.TheMouseMoved += new MouseMovedEvent(gmh_TheMouseMoved); 
     Application.AddMessageFilter(gmh); 

     InitializeComponent(); 
     } 

     void gmh_TheMouseMoved() 
     { 
     Point cur_pos = System.Windows.Forms.Cursor.Position; 
     System.Console.WriteLine(cur_pos); 
     } 
    } 

    public delegate void MouseMovedEvent(); 

    public class GlobalMouseHandler : IMessageFilter 
    { 
     private const int WM_MOUSEMOVE = 0x0200; 
     private System.Drawing.Point previousMousePosition = new System.Drawing.Point(); 
     public static event EventHandler<MouseEventArgs> MouseMovedEvent = delegate { }; 

     #region IMessageFilter Members 

     public bool PreFilterMessage(ref System.Windows.Forms.Message m) 
     { 
      if (m.Msg == WM_MOUSEMOVE) 
      { 
       System.Drawing.Point currentMousePoint = Control.MousePosition; 

       // Prevent event from firing twice. 
       if (previousMousePosition == new System.Drawing.Point(0, 0)) 
       { return; } 

       if (previousMousePosition != currentMousePoint) 
       { 
        previousMousePosition = currentMousePoint; 
        MouseMovedEvent(this, new MouseEventArgs(MouseButtons.None, 0, currentMousePoint.X, currentMousePoint.Y, 0)); 
       } 
      } 
      // Always allow message to continue to the next filter control 
      return false; 
     } 

     #endregion 
    } 
} 
0

尝试面板上的“MouseMove”事件。如果您禁用停靠的面板,表单的“MouseMove”事件将被触发。

+1

面板的鼠标移动事件仍然不会工作,因为里面有很多面板,如果我将每个鼠标移动事件写入每个面板内,都不是一个好方法。 –

+0

鼠标移动事件总是触发最顶端的控件。因此,您的底层表单的实施鼠标移动事件不会被触发。 – Hannes

0

这个例子对我来说是正确的,只有当我移动鼠标时,程序调用TheMouseMoved()方法。

public partial class Form1 : Form 
{ 
    int counter = 0; 
    public Form1() 
    { 
     GlobalMouseHandler gmh = new GlobalMouseHandler(); 
     gmh.TheMouseMoved += new MouseMovedEvent(gmh_TheMouseMoved); 
     Application.AddMessageFilter(gmh); 

     InitializeComponent(); 
    } 

    void gmh_TheMouseMoved() 
    { 
     Point cur_pos = System.Windows.Forms.Cursor.Position; 
     //System.Console.WriteLine(cur_pos); 
     System.Console.WriteLine("{0}. [ {1},{2} ]", counter++, (cur_pos.X - this.Location.X), (cur_pos.Y - this.Location.Y)); 
    } 
} 

public delegate void MouseMovedEvent(); 

public class GlobalMouseHandler : IMessageFilter 
{ 
    private const int WM_MOUSEMOVE = 0x0200; 

    public event MouseMovedEvent TheMouseMoved; 

    #region IMessageFilter Members 

    public bool PreFilterMessage(ref Message m) 
    { 
     if (m.Msg == WM_MOUSEMOVE) 
     { 
      if (TheMouseMoved != null) 
      { 
       TheMouseMoved(); 
      } 
     } 
     // Always allow message to continue to the next filter control 
     return false; 
    } 

    #endregion 
} 
相关问题