可以改变悬停间隔吗?

时间:2012-04-26 19:30:03

标签: c# winforms hover

我的代码允许用户将鼠标悬停在控件上,然后它会响应。但是,我希望徘徊更快一点。有没有办法加快悬停反应?

4 个答案:

答案 0 :(得分:5)

SystemInformation.MouseHoverTime事件生成之前有一个故意的时间延迟MouseHover毫秒,作为一个简单的替代方案,您可以使用MouseEnter事件代替,这将立即触发。

答案 1 :(得分:3)

可以。 Windows窗体中的悬停不遵循全局系统设置,并且已在dwHoverTime字段中的NativeMethods.TRACKMOUSEEVENT中设置为100毫秒。

然后在控件的本机窗口的WndProc方法中,WM_MOUSEMOVE被捕获来调用TrackMouseEvent,这反过来导致WM_MOUSEHOVER。您可以看到源代码here

因此,您可以通过将鼠标悬停的所需超时设置为TrackMouseEventWM_MOUSEMOVE字段来处理dwHoverTime并调用TRACKMOUSEEVENT。同时处理WM_MOUSEHOVER并引发一个自定义事件,例如MyMouseHover

然后,您可以轻松处理此自定义MyMouseHover事件。

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class SampleControl : Control
{
    [DllImport("user32.dll")]
    private static extern int TrackMouseEvent(ref TRACKMOUSEEVENT lpEventTrack);
    [StructLayout(LayoutKind.Sequential)]
    private struct TRACKMOUSEEVENT
    {
        public uint cbSize;
        public uint dwFlags;
        public IntPtr hwndTrack;
        public uint dwHoverTime;
        public static readonly TRACKMOUSEEVENT Empty;
    }
    private TRACKMOUSEEVENT track = TRACKMOUSEEVENT.Empty;
    const int WM_MOUSEMOVE = 0x0200;
    const int WM_MOUSEHOVER = 0x02A1;
    const int TME_HOVER = 0x1;
    const int TME_LEAVE = 0x2;
    public event EventHandler MyMouseHover;
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_MOUSEMOVE)
        {
            track.hwndTrack = this.Handle;
            track.cbSize = (uint)Marshal.SizeOf(track);
            track.dwFlags = TME_HOVER | TME_LEAVE;
            track.dwHoverTime = 500;
            TrackMouseEvent(ref track);
        }
        if(m.Msg == WM_MOUSEHOVER)
        {
            MyMouseHover?.Invoke(this, EventArgs.Empty);
        }
        base.WndProc(ref m);
    }
}

注释

  • 系统范围的SystemInformation.MouseHoverTime设置用于ToolTip。但是MouseHover事件紧随NativeMethods.TRACKMOUSEEVENTdwHoverTime字段的值设置为100毫秒。

  • 您可以在我的帖子中找到类似的实现,用于处理以下形式的标题栏上的悬停事件:Handle Mouse Hover on Titlebar of Form

  • 作为另一种选择,我还尝试设置控件的专用dwHoverTime字段的trackMouseEvent字段的值,并且该解决方案似乎也有效。

  • 您可以找到代码here的VB版本。

答案 2 :(得分:2)

如果您为此目的使用ToolTip组件,则可以将其InitialDelay属性设置为小于默认值500(半秒)的值。

顺便说一下,AutoPopDelayReshowDelay属性也很有用,分别确定鼠标重新进入控件客户区时的显示时间和延迟。

答案 3 :(得分:2)

您可以尝试使用鼠标悬停事件 not 的替代方法,而不是this site上的第一个答案。否则,如果你改变它,它将影响所有应用程序,而不仅仅是你的应用程序。