2016-05-31 6 views
-3

Ich möchte nicht auf eine Schaltfläche oder das Formular klicken, ich möchte nur wissen, ob der Benutzer die linke Maustaste drückt, während der Cursor in der Form ist.Erkennen, wenn Sie eine Maustaste drücken und welche WinForm C#

Ich habe dies versucht:

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

aber es funktioniert nicht.

Ich habe auch versucht PlayForm_Click() aber es funktioniert nur, wenn der Klick auf die ‚Leinwand‘ ist, wenn es etwas anderes auf wird es nicht

arbeiten
+10

'KeyDown' keine Maus bezogenes Ereignis ist. Vielleicht möchten Sie stattdessen ['MouseDown'] (https://msdn.microsoft.com/en-us/library/ms171542 (v = vs.110) .aspx) verwenden? – Sinatr

+2

Sie haben das gleiche Problem mit MouseDown. Welche Kontrolle Sie auch immer haben, ist diejenige, die Mausereignisse erhält. Wenn das eine Schaltfläche ist, werden die Mausereignisse angezeigt. Wenn es keine Kontrolle gibt, wird es das Formular selbst sein. Sie müssen das Ereignis auf dem entsprechenden Steuerelement behandeln. –

+0

@Sinatr nein es verhält sich genauso wie PlayForm_Click() –

Antwort

0

Sie die Maus eingeben/verwenden könnte hinterlassen Sie eine boolean einzustellen, dass die Mauszeiger befindet sich über dem Formular, dann können Sie die Maus verwenden.

... 
     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"); 
     } 
... 

etwas sorta so.

0

Soweit ich verstanden habe, möchten Sie einen Handler für einen Klick auf was auch immer in dem Formular ist. Ich schlage vor, Sie könnten durch alle Steuerelemente in der Form auf Ereignis iterieren und nur einen gemeinsamen Handler für die MouseClick (oder KeyPressed oder welches Ereignis Sie je nach Ihrem aktuellen Bedarf wollen) für alle Steuerelemente in der .Controls Sammlung in der Moment ist das Formular geladen und Sie sollten den gleichen Handler für das Formular selbst registrieren (aka this.MouseClick). Dies ist ein bisschen Overkill, wenn Sie später einen MouseClick-Handler für ein bestimmtes Steuerelement registrieren möchten, aber Sie können immer das sender-Objekt vergleichen und die Daten von dort abrufen. Beispielcode ist momentan nicht vorhanden, da ich von meinem Handy aus tippe. Wird später aktualisiert.

0

Das Hauptproblem besteht darin, dass das Formular keine Nachrichten erhält, wenn eine Nachricht direkt an ein untergeordnetes Steuerelement gesendet wird.

Eine Möglichkeit, einen anwendungsweiten Nachrichtenfilter zu registrieren, besteht darin. Beachten Sie, dass die folgende Umsetzung eher ineffizient ist (und ziemlich hässlich), aber es sollte Ihnen die Grundidee zeigen:

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

Wenn Sie gerade ist Maustaste gedrückt, wenn der linke wissen wollen, während einige andere Code in der Ausführung bilden Sie bei der statischen Eigenschaft Control.MouseButtons suchen, die einen Wert aus der MouseButtons Aufzählung .EG zurück:

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