2016-08-16 69 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 
} 
相關問題