主な問題は、メッセージが子コントロールに直接送信されたときにフォームにメッセージが表示されないことです。
これを回避する方法の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;
}
}
'KeyDown'がマウス関連のイベントではありません。代わりに、代わりに['MouseDown'](https://msdn.microsoft.com/en-us/library/ms171542(v = vs.110).aspx)を使用したいでしょうか? – Sinatr
MouseDownで同じ問題が発生します。どちらのコントロールをマウスに置いても、マウスイベントが発生します。これがボタンの場合は、マウスイベントが発生します。コントロールがない場合は、フォーム自体になります。適切なコントロールでイベントを処理する必要があります。 –
@SinatrいいえPlayForm_Click()と同じように動作しますが、 –