2016-05-31 8 views
-3

ボタンやフォームをクリックしたくない場合は、カーソルがフォーム上にあるときにマウスの左ボタンを押しているかどうかを知りたい。マウスボタンを押した場合、WinFormを検出する場合#

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

私が理解している限り、フォーム内にあるものをクリックするハンドラが必要です。私はあなたがイベントのフォームのすべてのコントロールを繰り返すことができ、(または現在の必要性に応じてKeyPressedまたはいずれかのイベント)の共通ハンドラを設定することをお勧めします。.Controlsフォームがロードされると、フォーム自体に同じハンドラを登録する必要があります(別名this.MouseClick)。後で特定のコントロールにMouseClickハンドラを登録したい場合は、これはちょっと残念ですが、いつでもsenderオブジェクトを比較してそこからデータを取得できます。私の電話から入力しているので、今のところコードの例はありません。後で更新されます。

0

主な問題は、メッセージが子コントロールに直接送信されたときにフォームにメッセージが表示されないことです。

これを回避する方法の1つは、アプリケーション全体のメッセージフィルタを登録することです。次の実装はかなり非効率的な(そしてかなり醜い)であることに注意してください、それはあなたの基本的な考え方表示する必要があります:あなただけでは、いくつかの他のコードを実行しながら、マウスの左ボタンが押されているかどうかを知りたい場合は

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

MouseButtons列挙.Egから値を返す、あなたは静的プロパティControl.MouseButtonsを見ることができますフォーム:

if ((Control.MouseButtons & MouseButtons.Left) != 0) 
関連する問題