2016-05-31 193 views
-3

我不想點擊一個按鈕或窗體,我只想知道當光標在窗體中時用戶是否按下了鼠標左鍵。檢測是否按下鼠標按鈕和哪個WinForm c#

我已經試過這樣:

private void PlayForm_KeyDown(object sender, KeyEventArgs e) 
{ 
    if(e.KeyCode == Keys.LButton) 
    { 
     ... 
    } 
} 

,但它不工作。

我也試過PlayForm_Click()但當點擊是在「畫布」,如果有在上面別的東西它只能是行不通

+10

'KeyDown'不是鼠標相關的事件。也許你想使用['MouseDown'](https://msdn.microsoft.com/en-us/library/ms171542(v = vs.110).aspx)? – Sinatr

+2

您將遇到與MouseDown相同的問題。無論您將鼠標懸停在哪個控件上,都將獲得鼠標事件。如果這是一個按鈕,它會得到鼠標事件。如果沒有控制權,那將是形式本身。您需要在適當的控制下處理事件。 –

+0

@Sinatr否,它的行爲與PlayForm_Click()相同 –

回答

0

,你可以使用鼠標進入/離開設置一個布爾值,該鼠標光標在窗體上,那麼你可以使用鼠標。

... 
     bool mouseOverMe; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      mouseOverMe = false; 
     } 

     private void Window_MouseEnter(object sender, MouseEventArgs e) 
     { 
      mouseOverMe = true; 
     } 

     private void Window_MouseLeave(object sender, MouseEventArgs e) 
     { 
      mouseOverMe = false; 
     } 

     void doSomething() 
     { 
      if (Mouse.LeftButton == MouseButtonState.Pressed) 
       if (mouseOverMe) 
        MessageBox.Show("Im a mouse down in the window"); 
     } 
... 

東西就像這樣。

0

據我所知,你需要一個處理程序來點擊窗體中的任何東西。我建議你可以通過事件中的表單中的所有控件進行迭代,併爲.Controls集合中存在的所有控件設置MouseClick(或KeyPressed或根據當前需要選擇的事件)的常用處理程序。當表單被加載時,你應該爲表單本身註冊相同的處理程序(又名this.MouseClick)。如果稍後要爲特定控件註冊MouseClick處理程序,這將會有點矯枉過正,但您始終可以比較sender對象並從中獲取數據。示例代碼現在不存在,因爲我正在使用手機進行輸入。稍後更新。

0

主要問題是當消息直接發送到子控件時,表單不會收到任何消息。

解決這個問題的方法之一是註冊一個應用程序範圍的消息過濾器。請注意,下面的實現是相當低效(和相當難看),但它應該告訴你的基本思路:

void Main() 
{ 
    var form = new Form(); 
    form.Load += (s, _) => Application.AddMessageFilter(new MyFilter((Form)s)); 

    var pnl = new Panel(); 
    pnl.Controls.Add(new Button()); 
    form.Controls.Add(pnl); 

    Application.Run(form); 
} 

public class MyFilter : IMessageFilter 
{ 
    Form form; 

    public MyFilter(Form form) 
    { 
    this.form = form; 
    this.form.Disposed += (_, __) => Application.RemoveMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message msg) 
    { 
    const int WM_LMOUSEDOWN = 0x0201; 

    if (msg.Msg == WM_LMOUSEDOWN && msg.HWnd != IntPtr.Zero 
     && Control.FromHandle(msg.HWnd).TopLevelControl == form) 
    { 
     Console.WriteLine("Hi!"); 
    } 

    return false; 
    } 
} 
0

如果你只是想知道,如果鼠標左鍵向下,而執行在一些其他的代碼形成你可以看看靜態屬性Control.MouseButtons,從MouseButtons枚舉.Eg返回值:

if ((Control.MouseButtons & MouseButtons.Left) != 0)