8

ユーザーがフォームとそのすべての子コントロールの上にマウスを移動したとき、およびフォームから離れたときを検出する必要があります。MouseEnterフォームのとMouseLeaveイベントを試しました。Windowsメッセージの&WM_MOUSEMOVEWM_MOUSELEAVEWM_NCMOUSEMOVEWM_NCMOUSELEAVEペアを試しましたが、希望どおりに機能しないようです...

私のフォームのほとんどは、さまざまな種類の子コントロールで占められており、表示されるクライアント領域はあまりありません。これは、マウスを非常に速く動かすと、マウスがフォーム内にあるにもかかわらず、マウスの動きが検出されないことを意味します。

たとえば、下部にドッキングされているTextBoxがあり、デスクトップとTextBoxの間に、非常に小さな境界線しかありません。マウスを下からTextBoxにすばやく移動すると、マウスの移動は検出されませんが、マウスはTextBox内、つまりフォーム内にあります。

どうすれば必要なことを達成できますか?

4

4 に答える 4

13

メインメッセージループをフックして、任意の(WM_MOUSEMOVE)メッセージを前処理/後処理することができます。

public class Form1 : Form {
    private MouseMoveMessageFilter mouseMessageFilter;
    protected override void OnLoad(EventArgs e) {
        base.OnLoad( e );

        this.mouseMessageFilter = new MouseMoveMessageFilter();
        this.mouseMessageFilter.TargetForm = this;
        Application.AddMessageFilter(this.mouseMessageFilter);
    }

    protected override void OnClosed(EventArgs e) {
        base.OnClosed(e);
        Application.RemoveMessageFilter(this.mouseMessageFilter);
    }

    private class MouseMoveMessageFilter : IMessageFilter {
        public Form TargetForm { get; set; }

        public bool PreFilterMessage( ref Message m ) {
            int numMsg = m.Msg;
            if ( numMsg == 0x0200 /*WM_MOUSEMOVE*/)
                this.TargetForm.Text = string.Format($"X:{Control.MousePosition.X}, Y:{Control.MousePosition.Y}");

            return false;
        }
    }
}
于 2009-06-12T13:12:59.657 に答える
1

迅速で汚い解決策:

private bool MouseInControl(Control ctrl)
{
    return ctrl.Bounds.Contains(ctrl.PointToClient(MousePosition));
}
于 2015-07-01T09:13:05.037 に答える
0

ユーザーコントロールで、このようなコントロールのマウスホバーイベント(または他のイベントタイプ)を作成します

private void picBoxThumb_MouseHover(object sender, EventArgs e)
{
    // Call Parent OnMouseHover Event
    OnMouseHover(EventArgs.Empty);
}

UserControl をホストする WinFrom では、UserControl が Designer.cs で MouseOver を処理するためにこれを使用します。

this.thumbImage1.MouseHover += new System.EventHandler(this.ThumbnailMouseHover);

WinFormでこのメソッドを呼び出すもの

private void ThumbnailMouseHover(object sender, EventArgs e)
{

    ThumbImage thumb = (ThumbImage) sender;

}

ThumbImage はユーザーコントロールのタイプです

于 2011-04-08T19:23:19.487 に答える